NOMBRE PREMIER

cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007 - 4 avril 2002 à 18:02
TRAX44 Messages postés 93 Date d'inscription mercredi 18 septembre 2002 Statut Membre Dernière intervention 20 juillet 2006 - 26 févr. 2006 à 15:24
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/9598-nombre-premier

TRAX44 Messages postés 93 Date d'inscription mercredi 18 septembre 2002 Statut Membre Dernière intervention 20 juillet 2006
26 févr. 2006 à 15:24
le seul nombre pair et premier que je connaisse est 2 alors compté de deux en deux divise le nombre de calcule par deux :)
Sinon utilisé la racine du nombre n'est peut etre pas une bonne idée :
un racine prend du temps a etre calculer mais n'est calculé qu'un fois par nombre a tester. Dans le cas contraire faire le teste avec le carré de i et le nombre a tester

Cordialment
trax
The Waxy Man Messages postés 26 Date d'inscription lundi 24 septembre 2001 Statut Membre Dernière intervention 6 novembre 2003
1 mai 2002 à 19:49
Aufait, mon but était de fais un prog en C et pas en C++ donc les "cout" ne sont pas au programme.
et aussi, j'ai relu le prog et je me rend compte que je l'ai refait avec un while:

/*
Programme qui dit si un nb est 1e ou pas.
Un nb 1e est divisible par 1 et par lui meme.
1 n'est pas un nb 1e.

Seul nombre%nombre peut valoir 0 ainsi que nombre%1

*/

/*drapeau doit valoir 2 car il y a 2 conditions pour les nbs 1e
on ne teste que de 1 à 10 (dans le for) car les autres nbs sont des multiples
quand on passe dans le for, si le nb est < que 10, il est ajouté à drapeau car il est divisible par lui meme
Mais si le nb est > que 10 alors il n'est pas compté. Et comme tout les nombres sont divisibles par eux meme,
on ajoute 1 pour tout les nbs > que 10.*/

/* drapeau peut aussi s'appeler compteur */



#include <stdio.h>
#include <conio.h>
#include <ctype.h>
main()
{

int nombre;
int i;
int drapeau;
char reponse='O';


while (reponse=='O')
{





clrscr();
drapeau=0;
printf("Veuillez entrer un nombre :
> ");
scanf("%d",&nombre);

switch(nombre)
{
case 1: break; // il va directement à else printf("

ce n'est pas un 1e!");
default: for (i=1;i<11;i++)
{
if (nombre%i==0) drapeau++;
printf("
\%d mod %d donne %d",nombre,i,nombre%i);
}
}

if (nombre>10) drapeau ++;
if (drapeau==2)
printf("

c'est un 1e");
else printf("

ce n'est pas un 1e!");


printf("

Voulez vous recommencer ? <O/N>
>");
reponse=toupper(getch());
}



return 0;
}


Et aussi, il me semble que le prog fonctionne tres bien.. je l'ai testé avec une dixaine de nbs mais j'ai pas été jusqu'au million ;-)
The Waxy Man Messages postés 26 Date d'inscription lundi 24 septembre 2001 Statut Membre Dernière intervention 6 novembre 2003
1 mai 2002 à 19:42
merci pour toutes vos remarque.
Ca ne fais que 2 mois que je fais du C alors désolé pour les fautes.
Merci pour votre aide !! @+
ADPro22 Messages postés 126 Date d'inscription mercredi 18 juillet 2001 Statut Membre Dernière intervention 27 octobre 2004
9 avril 2002 à 15:04
la boucle for, c'est : for(int i=2; i<=racine; i++)
(inferieur ou egal a racine)
cs_Bki Messages postés 32 Date d'inscription vendredi 18 janvier 2002 Statut Membre Dernière intervention 25 mai 2004
8 avril 2002 à 21:18
#include <math.h>
#include

bool premier(int nb)
{
bool res=true;
int racine=sqrt(nb);
for(int i=2; i<racine; i++)
{
if(nb%i==0)
res=false;
}
return res;
}

int main()
{
{
int nombre=9;
bool nbpremier=premier(nombre);

if(nbpremier)
cout << nombre << " est premier" << endl;
else
cout << nombre << " n'est pas premier" << endl;
}
return EXIT_SUCCESS;
}

J'ai pas vérifié, y a ptet une faute.
ADPro22 Messages postés 126 Date d'inscription mercredi 18 juillet 2001 Statut Membre Dernière intervention 27 octobre 2004
6 avril 2002 à 17:09
Il y a une erreur :
Quelques petits rappels sur la division euclidienne s'imposent.
Soit (a,b) un couple d'entiers. Alors il existe un unique couple d'entiers (q,r) avec 0<=r<b tel que l'on ait a = b*q+r
et a%b = r est le reste de la division euclidienne de a par b.
Donc (a%b = 0) equivaut à (b est un diviseur de a)
Pour voir que a est premier, il faut donc montrer qu'aucun nombre premier inférieur ou égal à la racine carrée de a ne divise a.

Voila et Bonne chance
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
4 avril 2002 à 18:02
J'ai pas testé ton code mais je ne suis pas certain que ta routine soit tres bonne, car tu ne divise que jusqu'a 11 alors que tu devrais diviser avec tout les nombre jusqu'a nombre a tester ou jusqu'a sa racine carré pour aller plus vite car sinon tu risque de dire que des nombre sont premier alors qu'ils ne le sont pas (cela dis j'ai passé qu'un rapide coup d'oeil sur ton source donc je me trompe peut etre) enfin si tu veux je peux te filer le source que j'ai fais sur les nombre 1°
Rejoignez-nous