SEQUENCE 6 - Un exemple de Malloc
Le sujet porte sur l'implémentation du crible
d'Eratost&eagrave;ne qui consiste a construire dans la suite des N
premiers entiers celle des nombres premiers. On
peut le décrire informellement de la
manière suivante :
1 et 2 sont premiers,
tant que on n'a pas dépassé une certaine borne :
prendre le plus petit nombre non rayé et rayer tous ces
multiples inférieurs a N
La liste des nombres non rayés est celle des nombres premiers
inférieurs à N.
Si un tableau T est initialisé par T[i]:=i, barrer le nombre i
peut être réalisé en effectuant T[i]:=0.
Première implémentation
Donner une première implémentation eratofix.c dans la quelle
N sera fixé dans eratofix.h. La fonction d'impression des nombres
premiers utilisera une fonction
int next_prime(int e)
donnant l'entier premier immédiatement supérieur à
e.
Implémentation pour une taille quelconque
On décide de passer la taille du crible via la ligne de commande.
On rappelle que pour allouer un tableau de n cases de type T
on doit écrire quelque chose du style :
T* t ;
...
t = malloc(n * sizeof(T));
Ecrire un module permettant la prise en compte de cette situation. On
écrira donc trois programmes erato.h,
erato.c et main.c.
Amélioration du stockage
Vous avez utilise un tableau de la forme
0 1 2 3 0 5 0 7 0 0 0 11 0 13 0 0 0 17 0 19 ...
pouvez-vous gagner de la place en tassant un peu tous ces
nombres ? (par exemple en ne considerant aucun nombre pair ?!)
3 5 7 0 11 13 0 17 19 0 23 ...
sujet de reflexion (facultatif)
Chaque appel à next_prime() provoque une boucle.
Peut-on (en changeant un minimum d'implementation) gagner du
temps de calcul dans le cas d'une utilisation intensive de la
table ? On ne redéfinira pas erato.h