[c++] Les nombres de Fermat
Résolu
widi70
Messages postés
649
Date d'inscription
Statut
Membre
Dernière intervention
-
Mahmah Messages postés 496 Date d'inscription Statut Membre Dernière intervention -
Mahmah Messages postés 496 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Rémi et safia ont découvert le code binaire des nombres en cours d'informatique. ils l'utilisent pour se donner des rendez-vous secrets. ils ont décidé que : un message comporte 5 bits et donne le jour puis le moment les jours et les moments sont traduits par les nombres comme ci-dessous
- Le code ascii en informatique - Guide
- Code binaire des nombres - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Nombre de jours entre deux dates excel - Guide
- Winrar 64 bits - Télécharger - Compression & Décompression
9 réponses
On va apporter quelques corrections...
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 :
- 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) :
Bonne chance
#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
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
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
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.
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Non :-) Pour ca il faudrait écrire :
Bonne chance
std::cout << "2^2^" << i << " = " << calcul << std::endl;
Bonne chance
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
merci bcp
et sinon t'aurais pas un algo qui dit si un nombre est premier ou non
merci enormement de votre aide
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
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