Trouver les nombres premiers inférieurs à une limite donnée

Soyez le premier à donner votre avis sur cette source.

Vue 5 197 fois - Téléchargée 221 fois

Description

Liste tout les nombres premiers inférieurs à la limite que l'utilisateur renseigne.
S'arrete si la limite est inférieure à 1 ou si elle n'est pas un nombre.
Pour plus de rapidité, le code ne vérifie que les nombre et diviseurs pairs.
Affiche le nombre d'itérations que chaque nombre à pris.
Enregistre les résultats dans un fichier (nombres_premiers.txt) créé dans le même répertoire que le programme.

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

int main()
{
    FILE* fichier = NULL;
    fichier = fopen("nombres_premiers.txt", "w+");

    if (fichier == NULL)
    {
        printf("impossible d'ouvrir/initialiser le fichier.\n");

        Sleep(100);
        while(1)
        {
            if (GetKeyState(0x0D)<-1)
                break;
            Sleep(10);
        }

        return 0;
    }
    int nombre=3,test=2,limite=0,premier=1,compteur=0;

    printf("Veuillez entrer une limite : ");
    scanf("%d",&limite);
    if (limite>=2)
        printf("2 ce nombre a pris 0 iterations.\n",nombre,compteur);

    if (limite<=0)
    {
        printf("je demandais un chiffre hein... ? et plus grand que 0 ^^'\n");

        Sleep(100);
        while(1)
        {
            if (GetKeyState(0x0D)<-1)
                break;
            Sleep(10);
        }

        fclose(fichier);
        return 0;
    }

    for(nombre=3;nombre<=limite;nombre+=2)
    {
        for(test=3,compteur=1;test<=(sqrt(nombre)) && premier;test+=2,compteur+=1)
        {
            premier=(nombre%test!=0);
        }

        if (premier)
        {
            printf("%d ce nombre a pris %d iterations.\n",nombre,compteur);
            fprintf(fichier,"%d ce nombre a pris %d iterations.\n",nombre,compteur);
        }

        premier=1;
    }
    printf("\n");

    Sleep(100);
    while(1)
    {
        if (GetKeyState(0x0D)<-1)
            break;
        Sleep(10);
    }

    fclose(fichier);
    return 0;
}

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

pgl10
Messages postés
313
Date d'inscription
samedi 18 décembre 2004
Statut
Membre
Dernière intervention
6 juillet 2019
1 -
C'est bien. Après 2 et 3 tous les nombres premiers sont de la forme 6k-1 ou 6k+1, cela permet d'éviter d'essayer les multiples de 2 et 3. On peut aussi éviter les multiples de 2, 3 et 5. Voir http://www.cppfrance.com/code.aspx?ID=52531. Mais pour aller encore plus vite il faut utiliser un tableau auxiliaire comme à http://www.cppfrance.com/code.aspx?ID=52234. Pour ceux qui veulent faire le calcul rapidement.
Kevin95870
Messages postés
5
Date d'inscription
vendredi 6 novembre 2009
Statut
Membre
Dernière intervention
20 juin 2011
-
Il serait bien de penser a fermer les fichier ouverts quand on sort du programme. par exemple dans le cas d'erreur :
if (limite<1)
{
printf("je demandais un chiffre hein... ? et plus grand que 0 ^^'\n");
system("pause");
return 0;
}

on pourrait mettre un petit fclose().
pgl10
Messages postés
313
Date d'inscription
samedi 18 décembre 2004
Statut
Membre
Dernière intervention
6 juillet 2019
1 -
Pour afficher les nombres premiers inférieurs à 1000 :
#include <stdio.h>
#include <conio.h>
main(x,y) {printf("2\n");for(;x++&&x<1000;)
for(y=2;x%y;)++y/x&&printf("%d\n",x);getch();}
takisho
Messages postés
2
Date d'inscription
lundi 25 juillet 2011
Statut
Membre
Dernière intervention
10 août 2011
-
salut les amis
je suis un debutant en programmation ,j'ai ecrit un programme qui fait la meme chose mais d'un code source plus simple et je veux connaitre à quoi sert l'expression GetKeyState(0x0D)<-1 il me semble inutile
voici mon code source

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double reinit(double* point);//la fonction qui reinitiale m à la fin de la 1e boucle

int main(int argc,char*argv[])
{
double n=47.0,p=1.0,i=0, m=2.0;/*meme si on a pas declaré m à l'interieur de la 1e boucle(va voir dietamain dans le dossier calculateur de nombre primaire) m est reinitialé
à 2 a la fin la 1e boucle à l'aide de la fonction reinit qui prend
comme paramaitre un pointeur(ces pointeur sont vraiment utile)je crois que l'utilisation de la fonct reinit et mieux car au lieu de declarer et reinitialer
m chaque fois de nouveau (ce qui prendre plus de temps) on fais just la reinitialisation de m*/

//pour que la 2e boucle commence a marche il faut que m=2 car si m=1 la 1e condition de la 2e boucle ne sera pas verifiée(eh oui)
double *pnt=NULL;
pnt=&m;

/*boucle 0*/ // cette boucle est toujours à marche car la condition est toujors vrai (1=vrai et 0=faux)
{
printf("entrer un nombre : ");
scanf("%lf",&n);

/*1e boucle*/ while(n-i>1)//1e boucle
{
// double m=2; c'est ici qu'on a declaré m dans la version precedante

/*2e boucle*/ while((n-i)/m != floor((n-i)/m) && m<=(n-i))/*la 1e condetion est pour verifier que n-i n'est devisible par aucun nombre
on sait que n-i ne peut etre devisible que par un nombre inferieur à lui alors on a ajouté la 2e condetion(il ne faut pas etre un génie en math pour comprendre ça,non'heheheheh)*/

{
m++;
}

if(m==(n-i))// si a la fin de la 2e boucle m=n-i c'est a dire que tout les valeurs de m < à n-i ont pas pu devisés n-i alors n-i est primaire

/*Rmq:pourquoi m=n-i et pas m=n-i+2 quand sa valeur initiale est 2?la repense c'est qu'on incrimente m que n-i-2 fois un exemple est mieux que mille explications
on prend n-i=7 on a(7/2==>m+1=3, 7/3==>m+1=4, 7/4==>m+1=5, 7/5==>m+1=6, 7/6==>m+1=7) donc à la fin m=7=n-i*/
{
printf("le %3.0fe nombre primaire est %6.0f\n",p,n-i);
p++;
}
reinit(pnt);

i++;
}
}

system("pause");
return 0;
}
double reinit(double *pnt1)
{
return*pnt1=2;
}
angrevol
Messages postés
3
Date d'inscription
mercredi 11 août 2010
Statut
Membre
Dernière intervention
17 juin 2011
-
ça vérifie si la touche entrée est appuyée.
juste pour éviter le message de la commande dos "pause"
Après ça revient au même de faire :
while(1)
{
if (GetKeyState(0x0D)<-1)
break;
Sleep(10);
}

et

system("pause);

Chacun son truc ^^

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.