begin process at 2012 02 12 08:29:14
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > NOMBRE PREMIER

NOMBRE PREMIER


 Information sur la source

Note :
Aucune note
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 871

Auteur : kuroro

Ecrire un message privé
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";
 }
}



 Sources du même auteur

CALCULETTE NUL

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

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...

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:)

Commentaire de Florent le 26/09/2003 13:29:59

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

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...

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 ...

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 ;)

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

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

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.

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 ;

}

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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales