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

Soyez le premier à donner votre avis sur cette source.

Vue 5 358 fois - Téléchargée 240 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

Messages postés
3
Date d'inscription
mercredi 11 août 2010
Statut
Membre
Dernière intervention
17 juin 2011

Normalement non, il n'y a pas de rapport entre les boucles et la rapidité du calcul des nombres.
la fonction "Sleep(temps_en_ms)" donne l'ordre au programme d'attendre x millisecondes avant d'exécuter la suite

Pour la fonction "GetKeyState(__in int nVirtKey)" Je te conseille ce lien http://tcharles.developpez.com/simul/

Sinon pour faire simple cette boucle s'exécute tant que l'utilisateur n'appuie pas sur la touche Entrée.
Messages postés
2
Date d'inscription
lundi 25 juillet 2011
Statut
Membre
Dernière intervention
10 août 2011

Hi ANGREVOL
peut-tu m'expliquer de plus le fonctionement de
while(1)
{
if (GetKeyState(0x0D)<-1)
break;
Sleep(10);
}
j'ai remplacer system("pause"); par cette boucle mais ce n'est pas la meme chose ,et pourquoi des fois tu ecrit Sleep(10) et d'autres fois Sleep(100)?

j'ai remarqué aussi que ton programme fait les claculs plus vite que le mien mais quand je supprime ces boucles leurs rapidité(je veux dire par rapidité que ton programme prend moins du temps que le mien pour trouve les nombre premiers à partire du meme limite) deviennent presque la meme y a t'il une relation entre la rapidité du programme et ces boucles?

merci d'avance et pardonne moi pour le dérangement je suis un grand debutant
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 ^^
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;
}
Messages postés
321
Date d'inscription
samedi 18 décembre 2004
Statut
Non membre
Dernière intervention
2 septembre 2020
2
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();}
Afficher les 7 commentaires

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.