1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-27 00:29:31 +00:00
cc65/samples/sieve.c
cuz 0740be0f73 Use static locals (again)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1051 b7a2c559-68d2-44c3-8de9-860c34a00d81
2001-10-13 15:46:03 +00:00

91 lines
1.8 KiB
C

/*
* Calculate all primes up to a specific number.
*/
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <conio.h>
/*****************************************************************************/
/* Data */
/*****************************************************************************/
#define COUNT 8192 /* Up to what number? */
#define SQRT_COUNT 91 /* Sqrt of COUNT */
static unsigned char Sieve[COUNT];
/*****************************************************************************/
/* Code */
/*****************************************************************************/
#pragma staticlocals(1);
int main (void)
{
/* Clock variable */
clock_t Ticks;
/* This is an example where register variables make sense */
register unsigned char* S;
register unsigned I;
register unsigned J;
/* Read the clock */
Ticks = clock();
/* Execute the sieve */
I = 2;
while (I < SQRT_COUNT) {
if (Sieve[I] == 0) {
/* Prime number - mark multiples */
S = &Sieve[J = I*2];
while (J < COUNT) {
*S = 1;
S += I;
J += I;
}
}
++I;
}
/* Calculate the time used */
Ticks = clock() - Ticks;
/* Print the time used */
printf ("Time used: %lu ticks\n", Ticks);
printf ("Press Q to quit, any other key for list\n");
/* Wait for a key and print the list if not 'Q' */
if (toupper (cgetc()) != 'Q') {
/* Print the result */
for (I = 2; I < COUNT; ++I) {
if (Sieve[I] == 0) {
printf ("%4d\n", I);
}
if (kbhit() && toupper (cgetc()) == 'Q') {
break;
}
}
}
return EXIT_SUCCESS;
}