[c++] Les nombres de Fermat

Résolu/Fermé
widi70 Messages postés 649 Date d'inscription jeudi 4 janvier 2007 Statut Membre Dernière intervention 22 juillet 2019 - 19 mars 2008 à 17:53
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 - 19 mars 2008 à 22:34
Bonjour a tous, j'ai fais un programme qui me liste tous les nombres de Fermat puis dire si ces nombres sont premiers ou pas.
Un code sans plus de difficultés que ça , malheureusement j'ai un problème

voici mon code

#include <iostream>
#include <math.h>
using namespace std;
int main(){
int n; //entier entrer par l'utilisateur
int i;
double calcul;
cout<<"Veuillez entrer un entier n"<<endl;
cin>>n;
cout<<"Les nombres de Fermat sont: "<<endl;
for (i=0; i<=n;i++){
calcul= pow((double)2,(double)(pow((double)2,n))); // donc je calcul 2^2^n

cout<<calcul<<"ce nombre est premier"<<endl;
system("pause");
}
}

Ce code compile très bien mais aucun résultat ne s'affiche.
Je n'ai pas encore fait la fonction pour les nombres premiers (justement si qqn la deja faite !!!! :) )
Merci d'avance de votre aide
A voir également:

9 réponses

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
19 mars 2008 à 18:09
On va apporter quelques corrections...
#include <iostream>
#include <cmath> // header c++ pour pow
#include <cstdio> // header c++ pour getchar()

int main(){
  unsigned n; // entier entré par l'utilisateur
  double calcul;
  std::cout << "Veuillez entrer un entier n" << std::endl;
  std::cin >> n;
  std::cout << "Les nombres de Fermat sont: " << std::endl;
  for(unsigned i=0;i<=n;i++){
    calcul = pow(2.0,pow(2.0,n)); // je calcule 2^2^n
    std::cout << calcul << " ce nombre est premier" << std::endl;
  } // <--- j'imagine que c'est un oubli ?
  getchar(); // standard contrairement à system("pause");
  return 0; // n'oublie pas le code de retour
}


Conseils de programmation

- Personnellement je trouve que tu ferais mieux d'écrire std::cout std::endl et std::cin et supprimer le using namespace std, mais tant que ça se cantonne à un .cpp pourquoi pas... Disons qu'il serait plus propre de taper :
using std::endl;
using std::cout;
using std::cin;

- On peut utiliser 2.0 au lieu de cast en double, ça suffit à lever l'ambiguité en terme de compilation (entre int et double). A priori quand on caste en C++ on utilise plutôt les cast du C++ par exemple static_cast<double> ou dynamic_cast<double> selon les besoins...

- Utilise des unsigned au lieu des int quand c'est forcément un entier positif (je pense en particulier à i et n qui sont sensés être positifs). Parce que là si l'utilisateur prend un n négatif avec un int ça fait une boucle infinie... Par ailleurs i ne devrait en toute rigueur être déclaré que pour le for (cf notion d'horizon (scope) en c++). En l'occurrence si tu saisis une valeur négative celle-ci sera convertie en entier positif, ce qui évitera au moins une boucle infinie.

- Pour la compilation n'oublie pas de linker avec la librairie math (option -lm). Par exemple si tu compiles avec g++ (donc par exemple devcpp ou code::blocks sous windows) :
g++ -W -Wall -lm plop.cpp

Bonne chance
0
widi70 Messages postés 649 Date d'inscription jeudi 4 janvier 2007 Statut Membre Dernière intervention 22 juillet 2019 65
19 mars 2008 à 19:58
bonjour et merci bcp de ton aide.
Donc j'ai fait toutes les modif que tu m'as conseillé sauf pour "std::cout std::endl et std::cin" j'ai appris comme ça et les prof aiment bien enfin...
Sinon lorsque j'ecrit les pow avec 2.0 le compilateur n'aime pas je voit pas trop pourquoi d'ailleur mais enfin bon.

Et sinon mon for se ferme bien juste apres mon cout (entre mon cout et mon getchar) pour qu'il m'affiche tous les nombres.
Sinon la fonction getchar() ne me permet pas d'avoir mon terminal ouvert assez longtemp pour que je puisse voir ce qu'il y a d'ecrit.
Et sinon lors de l'execution j'ai toujours le même probleme il m'affiche:

1.#INF ce nombre est premier

Donc je voit pas trop de quoi ça vient
Merci encore de ton aide
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
19 mars 2008 à 20:34
Salutations,

Pour un double, il y a un bit de signe, 11 bits d'exposant et 52 bits de mantisse.

L'exposant peut être positif ou négatif, ce qui laisse 10 bits de marge. L'ordre de grandeur maximal d'un double est alors 2^(2^10)

Essaie donc avec de très petites valeurs pour ton n au risque de très vite dépasser la capacité de codage d'un double.
Wikipedia: Nombres flottants à double précision


M.
0
widi70 Messages postés 649 Date d'inscription jeudi 4 janvier 2007 Statut Membre Dernière intervention 22 juillet 2019 65
19 mars 2008 à 20:42
bonjour et merci de ton aide. Donc en effet il y avait bien un probleme de "place"
Donc j'ai essaye avec des petits chiffres mais malheureusement mon for ne m'affiche que la même chose et je ne comprend pas trop pourquoi
Si je met n =3 il devrait ecrire:
2^2^0
2^2^1
2^2^2
2^2^3

enfin les resultats non?
Merci bcp
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
19 mars 2008 à 21:19
Non :-) Pour ca il faudrait écrire :
std::cout << "2^2^" << i << " = " << calcul << std::endl;

Bonne chance
0
widi70 Messages postés 649 Date d'inscription jeudi 4 janvier 2007 Statut Membre Dernière intervention 22 juillet 2019 65
19 mars 2008 à 21:29
honte a moi lol (j'ai melangé i et n )
merci bcp
et sinon t'aurais pas un algo qui dit si un nombre est premier ou non
merci enormement de votre aide
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
19 mars 2008 à 21:54
Donc ton problème est résolu ?
0
widi70 Messages postés 649 Date d'inscription jeudi 4 janvier 2007 Statut Membre Dernière intervention 22 juillet 2019 65
19 mars 2008 à 22:02
oui oui mon probleme est resolu:
le premier probleme etait au niveau de mes nombres il etait trop grand donc pas assez de place.
et le deuxieme probleme etait dans "calcul" ou j'ai mis n a la place de i
voila merci bcp
bonne soiree
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
19 mars 2008 à 22:34
Pour les nombres premiers, le Wikipédia fr donne un algo assez bateau.

M.
0