#include #include #include #include #define TEST( f, x ) ( *( f+( x )/16 )&( 1<<( ( ( x )%16L )/2 ) ) ) #define SET( f, x ) *( f+( x )/16 )|=1<<( ( ( x )%16L )/2 ) int main (int argc, char *argv[]) { unsigned char *feld = NULL, *zzz = NULL; unsigned long teste = 1, max, mom, hits = 1, count, alloc, s = 0, e = 1; time_t begin; if (argc > 1) max = atol (argv[1]) + 10000; else max = 14010000L; zzz = feld = malloc (alloc = (((max -= 10000L) >> 4) + 1L)); if (feld) { memset (zzz, 0, alloc); printf ("Searching prime numbers to : %ld\n", max); begin = time (NULL); while ((teste += 2) < max) if (!TEST (feld, teste)) { if (++hits % 2000L == 0) { printf (" %ld. prime number\x0d", hits); fflush (stdout); } for (mom = 3L * teste; mom < max; mom += teste << 1) SET (feld, mom); } printf (" %ld prime numbers found in %ld secs.\n\nShow prime numbers", hits, time (NULL) - begin); while (s < e) { printf ("\n\nStart of Area : "); fflush (stdout); scanf ("%ld", &s); printf ("End of Area : "); fflush (stdout); scanf ("%ld", &e); if (s <= 2 && e >= 2) printf ("%ld\t", 2L); count = s - 2; if (s % 2 == 0) count++; while ((count += 2) < e) if (!TEST (feld, count) && count != 1) printf ("%ld\t", count); } free (feld); } else { puts ("Memory allocation failure."); exit (EXIT_FAILURE); } return 0; }