/* Gl: 8190 takes too long for continuous testing. */
static void mark_count(int c) {
- printf("number of primes in [2..%d) : %d (correct: 2..500: 95)\n", SIZE, c);
+ printf("number of primes in [2..%d) : %d (correct: 2..500: 95)\n", SIZE, c);
}
static void runSieve(void) {
- int ITERATIONS = 100000;
- boolean *flags;
- int i, prime, k, iter, p;
- int iterations = 0;
- int count;
+ int ITERATIONS = 100000;
+ boolean *flags;
+ int i, prime, k;
+ int iterations = 0;
+ int count;
+ int s = SIZE;
- flags = (void *)malloc(sizeof(*flags) * SIZE);
+ flags = (void *)malloc(sizeof(*flags) * s);
- // loop around for measurements
- while(ITERATIONS > iterations) {
- for(i = 0; i < SIZE; i++)
- flags[i] = true;
- for(i = 2; i < SIZE; i++) {
- if(flags[i]) {
- prime = i;
- for(k = i + prime; k < SIZE; k += prime)
- flags[k] = false;
- }
- }
- iterations++;
- }
- // test correctness
- count = 0;
- for(i = 2; i < SIZE; i++) {
- if(true == flags[i]) {
- count++;
- }
- }
- mark_count(count);
+ // loop around for measurements
+ while(ITERATIONS > iterations) {
+#if 0
+ for(i = 0; i < SIZE; i++)
+ flags[i] = true;
+#endif
+ memset(flags, 0x01010101, s);
+ for(i = 2; i < s; i++) {
+ if(flags[i]) {
+ prime = i;
+ for(k = i + prime; k < s; k += prime)
+ flags[k] = false;
+ }
+ }
+ iterations++;
+ }
+ // test correctness
+ count = 0;
+ for(i = 2; i < s; i++) {
+ if(true == flags[i]) {
+ count++;
+ }
+ }
+ mark_count(count);
}
int main(int argc, char *argv[]) {
- int i;
+ printf("Sieve.c\n");
- printf("Sieve.c\n");
+ if (argc <= 1) {
+ printf("\nUsage: Sieve n\n");
+ printf("Continuing with default input.\n");
+ } else {
+ SIZE = atoi(argv[1]);
+ }
- if (argc <= 1) {
- printf("\nUsage: Sieve n\n");
- printf("Continuing with default input.\n");
- } else {
- SIZE = atoi(argv[1]);
- }
+ runSieve();
- runSieve();
-
- return 0;
+ return 0;
}