Tous les forums
Une formule qui pue le soufre👹👹👹👹👹
12/07/2025 à 09h41
De 2 Miliards à 4,2 Milliards
#include
#include
#include
int main() {
unsigned int val, rep,aff=0;
printf("\n(Programme Grifix - recherche des nombres premiers optimisé)\nInsérez la valeur sup de vos nombres : ");
scanf("%u", &val);
// Allocation de mémoire pour le tableau de bits
unsigned char *Tab = (unsigned char *)calloc((val + 7) / 8, sizeof(unsigned char));
if (Tab == NULL) {
printf("Erreur d'allocation de mémoire\n");
return 1;
}
unsigned int X = 3;
unsigned int nombre_de_premiers = 1; // On compte '2' comme premier
time_t debut = time(NULL);
// Parcours des nombres impairs pour marquer les non-premiers
for (X = 3; X * X <= val; X += 2) {
// Si X est un nombre premier (non marqué)
if (!(Tab[X / 8] & (1 << (X % 8)))) {
// Marquer les multiples impairs de X à partir de X*X
for (unsigned int n = X * X; n < val; n += 2 * X)
{
Tab[n / 8] |= (1 << (n % 8));
}
}
}
// Calcul du nombre de premiers
for (unsigned int i = 3; i < val; i += 2) {
if ((Tab[i / 8] & (1 << (i % 8))) == 0) {
nombre_de_premiers++;
}
}
time_t fin = time(NULL);
printf("\nTemps de recherche : %ld secondes\n", fin - debut);
printf("On a trouvé %d nombres premiers\n", nombre_de_premiers);
printf("Afficher les nombres premiers ? oui = 1,non=0 \t");
scanf("%d", &rep);
if (rep == 1)
{
for (unsigned int i = 3; i < val; i += 2) {
if ((Tab[i / 8] & (1 << (i % 8))) == 0) {
if ((aff++)%10==0) { printf("\n"); }
printf("\t %d",i) ;
}
}
}
free(Tab); // Libération de la mémoire allouée
return 0;
}