TROUVER LES NOMBRES PREMIERS INFÉRIEURS À UNE LIMITE DONNÉE
pgl10
Messages postés381Date d'inscriptionsamedi 18 décembre 2004StatutNon membreDernière intervention25 avril 2024
-
18 juin 2011 à 07:46
angrevol
Messages postés3Date d'inscriptionmercredi 11 août 2010StatutMembreDernière intervention17 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.
angrevol
Messages postés3Date d'inscriptionmercredi 11 août 2010StatutMembreDernière intervention17 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
Sinon pour faire simple cette boucle s'exécute tant que l'utilisateur n'appuie pas sur la touche Entrée.
takisho
Messages postés2Date d'inscriptionlundi 25 juillet 2011StatutMembreDernière intervention10 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és3Date d'inscriptionmercredi 11 août 2010StatutMembreDernière intervention17 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és2Date d'inscriptionlundi 25 juillet 2011StatutMembreDernière intervention10 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
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);
pgl10
Messages postés381Date d'inscriptionsamedi 18 décembre 2004StatutNon membreDernière intervention25 avril 202411 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és5Date d'inscriptionvendredi 6 novembre 2009StatutMembreDernière intervention20 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és381Date d'inscriptionsamedi 18 décembre 2004StatutNon membreDernière intervention25 avril 202411 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.
13 août 2011 à 03:56
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.
10 août 2011 à 17:23
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
6 août 2011 à 21:24
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 ^^
30 juil. 2011 à 17:19
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;
}
21 juin 2011 à 23:39
#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();}
20 juin 2011 à 14:31
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().
18 juin 2011 à 07:46