eratosthene.c
Le crible d'Ératosthène est une méthode pour découvrir les nombres
premiers. Il consiste à mettre tous les entiers (inférieurs ou égaux à une
certaine LIMITE)
dans une grille, puis à rayer méthodiquement tous les multiples des
nombres non encore rayés.
Exemple :
debut: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
raye2: 2 3 / 5 / 7 / 9 / 11 / 13 / 15 / 17 / 19 / 21 / 23 / 25
raye3: 2 3 5 7 / 11 13 / 17 19 / 23 25
raye5: 2 3 5 7 11 13 17 19 23 /
raye7: ...
On constate alors qu'il ne reste plus que des nombres premiers dans la grille.
En informatique, il est toutefois difficile de "rayer" un nombre.
On choisit donc de déclarer un tableau de booléens dont chaque case représentera
le nombre entier correspondant à son indice : si la valeur de la case est true,
c'est que l'entier correspondant n'est pas rayé.
Et rayer un nombre signifiera donc passer la case correspondante à
false.
- Écrire une procédure initV qui initialise correctement les
éléments du tableau passé en paramètre, pour signifier
qu'a priori, tous les entiers à partir de 2 sont candidats à être
premiers.
La LIMITE est également passée en paramètre.
- Écrire une procédure raye qui applique la méthode décrite ci-dessus
en mettant false dans le tableau passé en paramètre pour chaque
case correspondant à un nombre qu'elle doit "rayer" (inférieur ou égal
à la LIMITE également passée en paramètre).
.../...
Remarque : il est inutile de parcourir TOUS les nombres jusqu'à la
LIMITE.
Question : quand peut-on arrêter la boucle principale ?
- Écrire une procédure prepare qui applique la méthode du
crible d'Ératosthène au tableau
de booléens passé en paramètre, en appelant
les procédures initV et raye.
La LIMITE est également passée en paramètre.
- Écrire une procédure affiche qui affiche l'intégralité des nombres
premiers figurant dans le tableau passé en paramètre (jusqu'à la
LIMITE également passée en paramètre), à raison de 10 par
ligne.
- Écrire un main qui déclare puis "prépare" un tableau de booléens,
demande quelle action on veut faire (voir ci-dessous), puis effectue l'action,
ceci tant qu'on ne désire pas arrêter le programme.
Pour choisir l'action, on saisira un nombre de 0 à 3 :
0 pour sortir de la boucle et arrêter le programme,
1 pour appeler la procédure affiche (saisir la limite),
2 pour tester si un nombre est premier ou non (saisir ce nombre),
3 pour trouver le plus grand nombre premier inférieur ou égal
à un nombre (saisir ce nombre).
On supposera que l'utilisateur n'entre que des nombres entiers.
Exemple d'affichage (option 1) :
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229
...