int main (int argc, char* argv[]) { int i = 0; if (argc < 2) { printf ("missing length\n"); exit (1); } len = atoi(argv[1]); sieve = (unsigned char *) malloc (sizeof (unsigned char) * len); memset(sieve, PRIME, len); sieve[0] = 1; sieve[1] = 1; fill_sieve(2, len, len-2); //print_prime(); free (sieve); printf ("length: %d\n", len); return 0; }
int main (int argc, char **argv) { if (argc!=2) { fprintf (stderr, "Usage: ./sieve <n>\ncalcule et affiche les nombres premiers inferieurs a <n>.\n"); fflush (stderr); exit (10); /* non mais! */ } { int n; int *bits; n = atoi (argv[1]); // conversion chaine -> entier. if (n<2) { fprintf (stderr, "Ah non, quand meme, un nombre >=2, s'il-vous-plait...\n"); fflush (stderr); exit (10); } bits = malloc (8*n); // allouer de la place pour n entiers (booleens). // Ca prend 32 fois trop de place. Mais C-- n'a pas les operations &, |, // qui nous permettraient de manipuler des bits individuellement... if (bits==NULL) { fprintf (stderr, "%d est trop gros, je n'ai pas assez de place memoire...\n"); fflush (stderr); exit (10); } zero_sieve (bits, n); bits[0] = bits[1] = 1; fill_sieve (bits, n); print_sieve (bits, n); free (bits); // et on libere la place memoire allouee pour bits[]. } return 0; }
main() { char *sieve; int* prime_list; int pc = 0; int start = 100; int end = 1000; int i, j, k; int pri; int dig = 3; char prim[256]; char patt[256]; int len; int mc; int fm; int mr = 0; int maxmatch; int minmatch; int mixed; int dc = 1; sieve = malloc(2000000); int start_offs[10]; populate(); for (i = 0; i < 256; ++i) { patt[i] = 0; if (i < 10) start_offs[i] = 0; } prime_list = malloc(2000000 * sizeof(int)); if (!sieve) { printf("malloc fail\n"); exit(1); } fill_sieve(sieve, 2000000); for (i = 0; i < 2000000; ++i) { if (sieve[i]) { prime_list[pc++] = i; if (i > maxnum[dc]) { dc++; printf("%d is the first %d-digit prime\n", i, dc); start_offs[dc] = pc - 1; } } } printf("----------\n"); ++*patt; while (patt[7] == 0) { for (i = 0; i <= 7; ++i) { if (patt[i] > 11) { patt[i] = 1; ++patt[i+1]; if (patt[i+1] == 1) patt[i+1] = 2; } } if (*patt < 11 && *patt % 2 == 1) ++*patt; if (*patt < 11 && *patt - 1 == 5) ++*patt; len = 0; mixed = 0; for (i = 0; i <= 7; ++i) { if (patt[i] != 0) ++len; if (patt[i] == 11) mixed = 1; } if (len && mixed) { mc = 0; fm = -1; maxmatch = biggest_match(patt, len); minmatch = smallest_match(patt, len); if (minmatch < minnum[len]) minmatch = minnum[len]; for (pri = start_offs[len]; pri < start_offs[len + 1]; ++pri) { if (prime_list[pri] > minmatch) { --pri; break; } } for (i = pri; prime_list[i] <= maxmatch; ++i) { if (match(patt, prime_list[i], len)) { if (fm == -1) fm = prime_list[i]; ++mc; } } if (mc && mc > mr) { mr = mc; printf("%d: %d matches ", fm, mc); if (mc == 8) { printf("\nThe matches are: "); print_matches(patt, sieve, len); printf("\n"); printf("The pattern is: "); print_patt(patt, len); printf("\n"); goto done; } printf("\n"); } } ++*patt; } done: free(sieve); }