Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

NOMBRE PREMIER


Information sur la source

Catégorie :Maths & Algorithmes Niveau : Débutant Date de création : 25/09/2003 Date de mise à jour : 26/09/2003 19:39:50 Vu : 2 291

Note :
Aucune note

Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

Description

Désolé si je ne fais pas dans l'originalité , mais cette source m'a bien donnée du fil a retordre ( rigolez pas , j'ai du le recommencer 4 fois ) , je poursuis donc mon petit chemin de newbie dans le c++ avec cette source qui test si un nombre est premier ou non .
 

Source

  • #include <iostream.h>
  • int main(void)
  • {
  • for(;;)
  • {
  • int valeur;
  • int diviseur=2;
  • int test=0;
  • cout<<"Entrez un nombre superieur a 1 : ";
  • cin>>valeur;
  • if(valeur!=1)
  • {
  • while(diviseur<valeur-1)
  • {
  • if(valeur%diviseur==0)
  • {
  • test++;
  • }
  • if(diviseur==2)
  • {
  • diviseur++;
  • }
  • else
  • diviseur +=2;
  • }
  • if(test==0)
  • {
  • cout<<"Le nombre est premier\n";
  • }
  • else
  • cout<<"Le nombre n'est pas premier\n";
  • }
  • else
  • cout<<"1 n'est pas prit en compte\n";
  • }
  • }
#include <iostream.h>
int main(void)
{
for(;;)
{
int valeur;
int diviseur=2;
int test=0;

cout<<"Entrez un nombre superieur a 1 : ";
cin>>valeur;
if(valeur!=1)
{

 while(diviseur<valeur-1)
  {
   if(valeur%diviseur==0)
    {
     test++;
    }
   if(diviseur==2)
   {
    diviseur++;
   }
  else
  diviseur +=2;
 }
 if(test==0)
  {
   cout<<"Le nombre est premier\n";
  }
 else
 cout<<"Le nombre n'est pas premier\n";
 }
else
cout<<"1 n'est pas prit en compte\n";
 }
}

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 26/09/2003 12:02:17 administrateur CS

Si tu pensais bien l'algo avant de l'ecrire serait deja beaucoup + facile.
Autant etre clair c'est nul, a quoi sert de diviser par tous les nombres pairs ?
if(valeur & 1) a deja fait tous les nombres pairs.
Et reflechis jusqu'ou tester diviseur.
etc...

signaler à un administrateur
Commentaire de kuroro le 26/09/2003 12:11:36

Je veux bien reassayer , javais fait avant
if(diviseur==2)
{
diviseur++;
}
else
diviseur +=2;

mais je sais pas pourquoi ca marchait pas , je vais voir .
Quand tu dit reflechi jusqu'ou tester le diviseur , je pense que tu veut dire qu'il doit pas dépasser valeur/2 ?
Si c'est ca je vais changer.Merci pour tes conseils:)

signaler à un administrateur
Commentaire de Florent le 26/09/2003 13:29:59

Tu ne doit pas éviter de dépasser valeur/2 mais racine(valeur)

signaler à un administrateur
Commentaire de krakkou le 26/09/2003 17:19:06

c'est bien ton programme sauf que 1 n'est pas premier puisqu'il n'a qu'un seul diviseur...

signaler à un administrateur
Commentaire de JCDjcd le 26/09/2003 17:23:37

Holala, encore cela est un probleme d'algorithme ...
Mais il y a un probleme de programmation :
"while(diviseur&lt;valeur-1)"

Le jour ou valeur-1 est (toujours) inferieur 2  il y aura un boucle infinie ! (bon au bout de 4 milliard d'iteration ce sera pire)
Donc il faut demander a l'utilisateur de renter un nombre STRICTEMEMT superieur a 1


Juste un petite amelioration ...

signaler à un administrateur
Commentaire de kuroro le 26/09/2003 18:02:51

ok je vais me mettre au travail mais je promet rien car je sais pas encore faire les racine carré , me dite pas que je le trouve tout seul ;)

signaler à un administrateur
Commentaire de BruNews le 26/09/2003 18:07:19 administrateur CS

c'est fourni par le runtime C, fouille un peu.

signaler à un administrateur
Commentaire de kuroro le 26/09/2003 19:44:27

A y est , j'ai modifier la source qui ne prend plus 1 en compte , et elle ne teste que 2 comme chiffre pair pour les diviseur . Pour les racine , faut pas trop m'en demander , parcqu'en plus plus je comprend pas pourquoi le diviseur ne  doit pas etre superieur a la racine de la valeur.
PS:Je ne suis pas un matheux , je suis en Terminal Litteraire alors faut pas trop m'en demander.

signaler à un administrateur
Commentaire de Chouchou182 le 28/09/2003 14:40:30

Bijourr!

Décomposer un nombre en un produit de facteurs premiers est au programme de math de 2° générale alors je pense que tu as du passer par là...

Bon je propose un algo qui compte le nombre de facteurs premiers d'un nombre et les stocke dans un tableau.
Il suffit de s'arrêter à la racine carée du nombre (sqrt(n), inclus dans &lt;cmath&gt;), je vais pas expliquer pourquoi, ça me semble quand même assez intuitif...
Si la valeur retournée est 1, le nombre est prenmier :

int NbFacteursPremiers(unsigned Nombre) {

unsigned n = Nombre ;
int c = 0 ; // compteur
int divTeste = 3, limitTest ;

while ( n % 2 == 0 && n != 1 ) {

FacteursPremiers[c] = 2 ;
c++ ;
n /= 2 ;

}

if ( n == 1 ) return c ;

while ( n &gt; 1 ) {

limitTest = (int)(sqrt(n) + 1) ;

if ( divTeste &gt;= limitTest ) {

FacteursPremiers[c]= n ;
c++ ;
return c ;

}

while ( n % divTeste == 0 ) {

FacteursPremiers[c] = divTeste ;
c++ ;
n /= divTeste ;

}

divTeste += 2 ;

} // while

return c ;

}

signaler à un administrateur
Commentaire de arkarod le 20/06/2004 01:10:11

Salut

En fait, un nombre premier est dit premier si et seulement il n'est divisible que par 1 et lui-même, ce qui fait que 1 est le premier nombre premier car il satisfait aux 2 conditions.

En ce qui concerne le fait d'aller jusqu'à la racine carrée entière, c'est dû au fait que la multiplication est commutative :
Par exemple, prenons 64, sa racine carrée est 8; tous les autres produits qui les composent sont formés d'un facteur inférieur à 8 et d'un facteur supérieur à 8 :
soit par exemple 4*16, si le test sur 4 à déjà été fait, celui sur 16 est inutile car 4*16 = 16*4.
Ce qui fait que si un diviseur entier est trouvé avant la racine carrée  du nombre à tester, il y a forcémént un diviseur entier supérieur à la racine carrée et il n'est pas nécessaire d'en faire le test.

Pour finir, un moyen d'améliorer la méthode serait de tester uniquement les nombres 2, 3 et tous ceux qui répondent aux formules
((6*i)-1), ((6*i)+1) | avec i appartenant au domaine des entiers naturels car ce sont les seuls susceptibles d'êtres premiers, et tans qu'à faire, pour optimiser encore plus les tests, ces nombres pourraient êtres les seuls à devoir tester ceux qui suivent, pour éviter ainsi les tests redondants :
Par exemple, imaginons qu'un nombre soit testé avec le chiffre 3, il n'a plus besoin d'être testé avec le chiffre 9 pourtant, en ajoutant à chaque fois le chiffre 2 à 3, on obtient 5, 7, 9, 11, 13 avec le test sur 9
tandis qu'en prenant les formules précédantes avec i = 1, 2, 3, ..
on a 5 = 6*1-1, 7 = 6*1+1, 11 = 6*2-1, 13 = 6*2+1.

Il s'agit là de la méthode la plus optimisée qui donnant un résultat déterministe.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 15,163 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.