TROUVER LES NOMBRES PREMIERS INFÉRIEURS À UNE LIMITE DONNÉE

pgl10 Messages postés 381 Date d'inscription samedi 18 décembre 2004 Statut Non membre Dernière intervention 25 avril 2024 - 18 juin 2011 à 07:46
angrevol Messages postés 3 Date d'inscription mercredi 11 août 2010 Statut Membre Dernière intervention 17 juin 2011 - 13 août 2011 à 03:56
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53296-trouver-les-nombres-premiers-inferieurs-a-une-limite-donnee

angrevol Messages postés 3 Date d'inscription mercredi 11 août 2010 Statut Membre Dernière intervention 17 juin 2011
13 août 2011 à 03:56
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.
takisho Messages postés 2 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 10 août 2011
10 août 2011 à 17:23
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
angrevol Messages postés 3 Date d'inscription mercredi 11 août 2010 Statut Membre Dernière intervention 17 juin 2011
6 août 2011 à 21:24
ç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 ^^
takisho Messages postés 2 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 10 août 2011
30 juil. 2011 à 17:19
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;
}
pgl10 Messages postés 381 Date d'inscription samedi 18 décembre 2004 Statut Non membre Dernière intervention 25 avril 2024 11
21 juin 2011 à 23:39
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();}
Kevin95870 Messages postés 5 Date d'inscription vendredi 6 novembre 2009 Statut Membre Dernière intervention 20 juin 2011
20 juin 2011 à 14:31
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 381 Date d'inscription samedi 18 décembre 2004 Statut Non membre Dernière intervention 25 avril 2024 11
18 juin 2011 à 07:46
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.