-#define COUNT 8192 /* Up to what number? */
-#define SQRT_COUNT 91 /* Sqrt of COUNT */
+#define COUNT 16384 /* Up to what number? */
+#define SQRT_COUNT 128 /* Sqrt of COUNT */
static unsigned char Sieve[COUNT];
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
+#pragma staticlocals(1);
+
+
+
+static char ReadUpperKey (void)
+/* Read a key from console, convert to upper case and return */
+{
+ return toupper (cgetc ());
+}
+
+
+
int main (void)
{
/* Clock variable */
clock_t Ticks;
+ unsigned Sec;
+ unsigned Milli;
/* This is an example where register variables make sense */
register unsigned char* S;
register unsigned I;
register unsigned J;
+ /* Output a header */
+ printf ("Sieve benchmark - calculating primes\n");
+ printf ("between 2 and %u\n", COUNT);
+ printf ("Please wait patiently ...\n");
+
/* Read the clock */
Ticks = clock();
while (I < SQRT_COUNT) {
if (Sieve[I] == 0) {
/* Prime number - mark multiples */
- S = &Sieve[J = I*2];
+ J = I*2;
+ S = &Sieve[J];
while (J < COUNT) {
*S = 1;
S += I;
/* Calculate the time used */
Ticks = clock() - Ticks;
-
- /* Print the time used and wait for a key */
- printf ("Time used: %lu ticks\n", Ticks);
- printf ("Press Q to quit, any other key for list\n");
- if (toupper (cgetc()) == 'Q') {
- exit (EXIT_SUCCESS);
- }
-
- /* Print the result */
- for (I = 2; I < COUNT; ++I) {
- if (Sieve[I] == 0) {
- printf ("%4d\n", I);
- }
- if (kbhit() && toupper (cgetc()) == 'q') {
- break;
- }
+ Sec = (unsigned) (Ticks / CLOCKS_PER_SEC);
+ Milli = ((Ticks % CLOCKS_PER_SEC) * 1000) / CLOCKS_PER_SEC;
+
+ /* Print the time used */
+ printf ("Time used: %u.%03u seconds\n", Sec, Milli);
+ printf ("Q to quit, any other key for list\n");
+
+ /* Wait for a key and print the list if not 'Q' */
+ if (ReadUpperKey () != 'Q') {
+ /* Print the result */
+ J = 0;
+ for (I = 2; I < COUNT; ++I) {
+ if (Sieve[I] == 0) {
+ printf ("%4d\n", I);
+ if (++J == 23) {
+ printf ("Q to quit, any other key continues\n");
+ if (ReadUpperKey () == 'Q') {
+ break;
+ }
+ J = 0;
+ }
+ }
+ if (kbhit() && ReadUpperKey == 'Q') {
+ break;
+ }
+ }
}
return EXIT_SUCCESS;