Ce code permet de trouver tous les nombres premiers d'un intervalle de 1 à n...
Il se base sur l'algorithme du crible d'Erathostène (
http://www.chez.com/algor/math/eratho.htm)
Source / Exemple :
#include <stdio.h>
int main()
{
size_t size;
int *t;
int i, k;
FILE *fp = fopen("nb.txt", "w");
/* Allocation */
printf("Taille du tableau :\n");
scanf("%d", &size);
t = (int *)malloc(size * sizeof(int));
if(t == NULL){ printf("Memoire insuffisante.\n"); exit(getch()); }
/* Initialisation */
for(i = 0; i < size; i++) t[i] = i+1;
/* On remplace par 0, tout nombre non premier */
for(i = 2; i <= size; i++)
for(k = i; (k < size) && ( t[i-1] != 0 ); k++)
if(t[k] != 0)
if( (t[k] % i) == 0 ) t[k] = 0;
/* Affichage */
for(i = 0; i < size; i++)
{
if(i % 10 == 0) printf("\n");
printf("%03d ", t[i]);
}
/* Log dans un fichier */
if(fp == NULL){ printf("Erreur d'écriture.\n"); exit(getch()); }
fprintf(fp, "Nombres premiers de 1 à %d :\n", size);
for(i = 0; i < size; i++)
{
if( (i % 10 == 0) && (i != 0) ) fprintf(fp, "\n");
if(t[i] != 0) fprintf(fp, "%d ", t[i]);
}
fclose(fp);
getch();
return 0;
}
Conclusion :
Il affiche les resultats et les log dans un fichier. Par contre il y'a un petit bug de mémoire, on ne peut pas rentrer plus de 900 en taille de tableau, je ne comprends pas pourquoi. J'ai traduit le code en Perl, aucuns soucis ! (normal, pas de gestion de la mémoire). Si quelqu'un sait pourquoi, ça m'interesse. J'ai essayé de jongler entre les size_t et int dans les déclarations mais ça ne change rien...
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.