#ifdef MCC #define NULL 0 #else #include #include #endif int main (int argc, char **argv) { if (argc!=2) { fprintf (stderr, "Usage: ./sieve \ncalcule et affiche les nombres premiers inferieurs a .\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; } int zero_sieve (int *bits, int n) { int i; for (i=0; i=4) { printf ("\n"); // retour à la ligne. k = 0; delim = " "; } else printf (" "); // espace. } } fflush (stdout); // on vide le tampon de stdout, utilise par printf(). return 0; }