Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2642 connectés 

  FORUM HardWare.fr
  Programmation

  [C++] Tres Grands Débutants - Recherche nombres premiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Tres Grands Débutants - Recherche nombres premiers

n°34239
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 24-05-2001 à 17:55:32  profilanswer
 

Bonjour messieurs du forum prog.
Alors voila avant toute chose sachez que je me suis mis à la prog hier, et que je commence par le c++ (bah autant faire les choses bien)
Alors ce matin j'ai fais un prog ou on entre des notes et si on tape -1 il affiche la moyenne, la note la plus haute et la plus basse.
Apres ce difficile succès, j'ai voulu tester un peu les boucles, alors je me suis dis on va faire un prog de calcul de nombres premiers...
Voila mon idée :
 
 
on prend un nombre limite
on cherche les nombres premiers entre 1 et cette limite
1 nb:
-on teste
-si il est premier on l'affiche et on passe au suivant
-sinon on passe au suivant sans afficher
pour tester :
on compare le nombre avec tout ceux compris entre 1 et lui
si il est divisible par 1 et par lui et par un autre il est pas premier
sinon il l'est
pour tester la divisibilité :
je prend le module des 2 nombres, si il est egal a 0 le nb est divisible, sinon non.
 
pour le moment ca donne ca :
 
 
#include <iostream.h>
 
//partie comparaison
int compare(int nombre_y, int z)
{
 int mod;
 mod = nombre_y % z;
 if (mod==0)  
  {
  cout<<"Le nombre est divisible par "<<z<<" et donc pas premier"<<endl;
 }
 else cout<<nombre_y<<" est premier"<<endl; // on ne peut pas diviser pas ce chiffre, test avec la valeur suivante.
 
}
 
 
 
 
//partie test
int test(int nombre_a)
{
 int b;
 for (b==2; b==(nombre_a-1); b++)
 {
  compare (nombre_a,b);
   
 }
 
}
 
 
 
 
 
// partie principale
void main()
{
 int nombre;
 int limite;
 cout<<"Ce programme va chercher les nombres premiers compris entre 1 et le nombre que vous allez entrer."<<endl;
 cin>>limite;
 for (nombre==1; nombre==limite; nombre ++)
 {
  test (nombre);
 cout<<nombre<<"est premier"<<endl;}
}
 
 
qu'en pensez-vous ? je sais pas trop comme débloquer mon prog, il me dit a la compilation que g un pb de return.
 
Merci d'avance.


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
mood
Publicité
Posté le 24-05-2001 à 17:55:32  profilanswer
 

n°34241
tgrx
My heart is pumping for love
Posté le 24-05-2001 à 18:18:18  profilanswer
 

Voici une version qui fonctionne, j'ai legerement retouche ton programme.
 
#include <iostream>  
 
//partie comparaison  
bool compare(int nombre_y, int z)  
{  
  if (nombre_y % z == 0)
    return true;
  else
    return false;    
}  
 
//partie test  
void test(int nombre_a)  
{  
  int limite= nombre_a-1;
   
  int b;
  for (b=2; b<limite ; b++)  
    if (compare(nombre_a,b)==true) break;  
 
  if (b==limite) // Tous les tests ont echoue, on est alle jusqu'a la fin de la boucle
    cout << nombre_a << " est premier" << endl;
}  
 
// partie principale  
void main()  
{  
  int limite;  
  cout << "Ce programme va chercher les nombres premiers compris entre 1 et le nombre que vous allez entrer."<<endl;  
  cin >> limite;  
   
  for (int nombre=1; nombre <= limite; nombre ++)  
    test (nombre);  
}

n°34242
tgrx
My heart is pumping for love
Posté le 24-05-2001 à 18:24:14  profilanswer
 

Le probleme de return que t'annonce le compilateur, c'est que tu definis tes fonctions comme des int fonction(), donc elles doivent retourner un int.
 
Si tu ne veux rien retourner, il faut les definir en void, comme la fonction test ou main.
D'autre part y avait pas mal de trucs inextricables dans ton programme, donc je l'ai relativement modifie. La fonction compare renvoie desormais un booleen (vrai ou faux), suivant que nombre_a est divisible par b ou non.
 
La fonction test fonctionne ainsi : elle teste un a un les potentiels diviseurs, si jamais compare compare renvoie 'true', le break indique que l'on sort de la boucle for sans la terminer.
 
Le test suivant est alors tout bete : si b==limite, ca veut dire que toute la boucle for a ete parcourue, et donc que le nombre est premier.
 
J'espere que ces maigres explications pourront t'aider :hello:
 
 
Et pour augmenter la rapidite du programme, tu peux fixer limite a sqrt(nombre_a)+1. Dans ce cas il faudra include la librairie 'math.h'.
Ou encore dans la boucle for, ne tester que les nombres impairs, apres avoir fait un cas particulier pour 2 (qui n'est pas reconnu comme un nombre premier par le programme actuel).
 avec un for (b=3; b<limite; b=b+2);

n°34243
BlackWolf
Posté le 24-05-2001 à 18:26:42  profilanswer
 

bah voila je crois avoir trouvé (je débute aussi en c++).
de tes fonctions comme par exemple : void test(int nombre_a)  
sont de types void, c à dire qu'elles ne retournent pas de valeurs.  
Par contre int compare(int nombre_y, int z)  
elle est censée retourner un entier (int ...) et pour retourner cet entier tu dois justement mettre return [valeur ou variable](mais apparemment t'en a pas besoin donc a la place de int ... met void ...)
 
bon je sais c pas très clair mais en espérant avoir pu t'aider...
 
@+

n°34244
tgrx
My heart is pumping for love
Posté le 24-05-2001 à 18:33:59  profilanswer
 

#include <iostream>
#include <math.h>
 
// Retourne 'true' si nombre_a est premier, 'false' sinon
bool est_premier(int nombre_a)  
{  
  if (nombre_a < 4) return true;       // 1,2,3 sont premiers
  if (nombre_a % 2 == 0) return false; // Cas des nombres pairs
 
  int b, limite= 1+ (int) sqrt(nombre_a);  
  for (b=3; b<limite; b+=2)  // On ne teste que les nombres impairs
    if (nombre_a % b == 0) return false;  
   
  return true;
}  
 
void main()  
{  
  int limite;  
  cout << "Ce programme va chercher les nombres premiers compris entre 1 et le nombre que vous allez entrer."<<endl;  
  cin >> limite;  
   
  for (int nombre=1; nombre<= limite; nombre++)
    if (est_premier(nombre))
      cout << nombre << " est premier\n";
}

n°34248
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 24-05-2001 à 18:50:19  profilanswer
 

merci beaucoup pour votre aide, j'avais pas du tout penser au booleen, et pourtant ca apparait clairement comme la meilleure solution...
 
encore merci :)


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°34283
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 24-05-2001 à 19:59:45  profilanswer
 

vous avez des idées de progs relativement simple pour débuter ?


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°34287
tgrx
My heart is pumping for love
Posté le 24-05-2001 à 20:05:45  profilanswer
 

Je pense que tu pourrais faire des trucs tout simple en OpenGL, y a des tutoriaux un peu partout sur le net... et puis c moins rebarbatif que de faire un programme de gestion de bibliotheque ou autre...
 
Genre faire tourner un cube, se deplacer dans un monde en 3D, et en plus ca t'obligera a utiliser des structures de donnees pour gerer des donnees geometriques :hello:

n°34302
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 24-05-2001 à 20:51:27  profilanswer
 

si tu penses que c'est abordable je te crois, mais c'est assez impressionant (voire intimidant)


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°34306
XuTi
Posté le 24-05-2001 à 21:06:27  profilanswer
 

Je tiens a te preciser que la programmation en C++ que tu dis avoir commencer... ce n est pas de la programmation C++
C est juste de la programmation en C au quelle tu t aides des facilites du C++, utilisation de cin et de cout
 
La vrai programmation C++ fait intervenir les classes... tu dois encore apprendre avant de dire que tu programmes en C++

mood
Publicité
Posté le 24-05-2001 à 21:06:27  profilanswer
 

n°34307
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 24-05-2001 à 21:16:50  profilanswer
 

pour le coup du c / c++ je te rassure je suis au courant, j'ai un ami qui a bossé sur du RSA en C et je sais ce que c'est :)
 
disons que le c++ facilite un peu la syntaxe, mais les classes je vais y venir, tout doucement...


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°34363
davidmarli
Posté le 25-05-2001 à 11:20:17  profilanswer
 

Salut,
 
moi je ne réponds pas du point de vue info, le C++ c'est pas mon truc.
En revanche il me semble que t'as pas fait beaucoup de maths !!!
En effet pour tester si un nombre est premier il est INUTILE de tester ses diviseurs de 1 à lui-même !!!
1) tu testes s'il est pair ou pas  : s'il est pair il est pas premier!! (sauf 2 évidemment)
 
2) il suffit de tester jusqu'à racine carrée de n (où n est le nombre que tu testes) : je ne vais pas  rentrer dans les explications mais si n est ton nombre un nombre plus grand que racine carrée de n ne  pourra jamais diviser n.
 
3) Dès que tu as un diviseur, ce n'est pas la peine de continuer à tester les divisibilités : de toute façon il est pas premier, puisque divisible au moins par un nombre.
 
Voilà rien qu'avec ces deux tests, ton algo va être optimisé!!!!
 
PS : pour plus de détail, voir un cours d'ALGEBRE sur les nombres premiers.


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
n°34364
davidmarli
Posté le 25-05-2001 à 11:21:50  profilanswer
 

resalut,
 
oups j'avais sauté une ligne de code  : t'as déjà éliminé les nombres pairs, autant pour moi!!!


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
n°34366
tgrx
My heart is pumping for love
Posté le 25-05-2001 à 11:26:49  profilanswer
 

je pense que le programme que j'ai ecrit plus haut correspond a toutes tes remarques...

n°34368
myblood
Posté le 25-05-2001 à 11:32:27  profilanswer
 

Xavier_OM a écrit a écrit :

vous avez des idées de progs relativement simple pour débuter ?




Bonjour juste pour dire que pour commencer en progrmmation faire de l'openGl c'est pas terrible mais ca le devient apres.
Pour commencer il y a les algos de tri qui sont pas mal à faire  
(tri bulle, quick sort et compagnies). Je pense que l'openGL vient par la suite quand on commence a bien maitriser le c/c++.

n°34398
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 25-05-2001 à 13:00:23  profilanswer
 

pour les algos de tri, je vais essayer de me renseigner la dessus.
 
pour davidmarli, je te rassure je sais tout ca (je suis pas mauvais en maths) mais en étant à mon 2eme prog (ben oui 2 c tout) j'ai préféré tout tester plutot que d'éliminer les cas improbables, par peur de compliquer mon prog en m'avançant dans un truc mal maitrisé (dans ma tête j'aurai optimiser après, bien que la puissance des pc actuels soit enorme, mais ce cher tgrx s'en est occupé tres gentillement)


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C++] Tres Grands Débutants - Recherche nombres premiers

 

Sujets relatifs
je recherche un editeur d'exadecimal[javascript] tres tres simple !
A la recherche de graphics.h ...[SMIL] recherche sites d'informations
[HTML] pb tt con et très chiant avec les boutons radio et NS...tres simpple en visual basic
recherche d'un caractere avec expression reguliere en VbScriptRecherche video avi pour intégrer dans applications
[visual basic] a priori tres simple....sof pour moi![VC++] et calcules de nombres
Plus de sujets relatifs à : [C++] Tres Grands Débutants - Recherche nombres premiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR