Programme nombres premiers

Signaler
Messages postés
8
Date d'inscription
mardi 24 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009
-
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
-
Bonjour,

j ai une question pour un programme plutot math mais la question est pas math du tout... c est surement très facile a résoudre. En gros j ai 2 fonction qui doivent me permettre de trouver des nombres premiers.

le calcule est: si fonction02(x-2)/ fonction01(x)==0, alors fontion01(x) est un nombre premier...

le problème est le suivant... un utilisateur du programme doit pouvoir entrer un nombre n de son choix et le programme doit lui sortir tt les chiffre premier qui (corrspondent au calcule ci dessus) jusqu a n.

Donc pour ma main fonction j ai essayé de faire un boucle for du style for(i=0; i<=n; ++i) et
if fonction02(i-2)/fonction01(i)==0 output: <<fonction01(i)<<"sont des chffres premiers" mais ca marche pas... je sais pas si je doit plutot faire un tableau.... désolée si c est pas très clair, je peut poster le programme si jamais..

9 réponses

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
C'est pas super clair, mais ton raisonnement semble relativement correcte.
J'aurai effectivement fait un:

for(int i = 0; i <= n; ++i)
{
  int a = fonction02(i - 2);
  int b = fonction02(i);
  if ((a / b) == 0)
    std::cout << b << " est un nombre premier" << std::endl;
}


Que ce sont fonction01 et fonction02 ? J'ai considéré qu'elles retournaient des entiers, mais je n'en sais rien.
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
bonjour,

ce n'est pas clair, effectivement, et je me demande ce que tu as en tête quand tu parles de tableau.

par ailleurs, je suis surpris
- par la boucle, de 0 à n inclus
- par un appel à f(i-2) mais c'est peut être légitime pour f
- par une division qui ne vérifie pas que le dénominateur est différent de 0
- par le test (a/b) == 0. En réel, pour b!=0, c'est équivalent à (a == 0). en entier, c'est ( abs(a) < abs(b) )


thip
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
- par la boucle, de 0 à n inclus

Ce n'est pas faux en soit.
- par un appel à f(i-2) mais c'est peut être légitime pour f

fonction01(i) et pas fonction02(i), petite inattention de ma part.
- par une division qui ne vérifie pas que le dénominateur est différent de 0

Les cas d'erreur: pour plus tard.
- par le test (a/b) == 0. En réel, pour b!=0, c'est équivalent à (a == 0). en entier, c'est ( abs(a) < abs(b) )

Je n'ai fait que recopier en code quelque chose d'énoncer très vaguement. Impossible donc de corriger quoi que ce soit avant d'avoir des précisions supplémentaires :)
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
Désolé, CptPingu, je ne voulais pas te froisser, je m'adressais plutôt à I0o0I mais j'ai omis de le préciser.

thip
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
Désolé, CptPingu, je ne voulais pas te froisser, je m'adressais plutôt à I0o0I mais j'ai omis de le préciser.

Je ne suis pas froissé, tes remarques sont tout à fait pertinentes !
Messages postés
908
Date d'inscription
jeudi 26 juillet 2001
Statut
Modérateur
Dernière intervention
1 février 2015
2
s'il est froissé, il repassera !
Messages postés
8
Date d'inscription
mardi 24 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

Excusez moi, j i trop foiré, j devais etre fatiguée...

Donc je reprend: c'est pas divisé par, c est
fonction02(x-2)%fonction01(x)==0 (la ca parait un peu plus sensé). alors voila le programme les 2 fonction marchent mais pas la main (elle compile mais elle me retourne pas du tt ce que je veux... en plus je trouve bizarre j ai du définir 2x i pour que ca compile... bon tt facon c est faux donc si vous pouviez m indiquer une petite piste... merci bcp pour votre aide en tt cas!!)



//programme lucmes.cpp

// Ce programme va nous dire si des nombres de mersenne (de la forme 2^b-1) sont premier jusqu a un certain nombre n choisi grace au fonction lucas() et mersenne(). Le calcul est: si et seulement si la valeur lucas(i-2)%mersenne(i)==0, alors mersenne(i) est premier.


//lucas-lehmer function
//PRE: on doit choisir une valeur pour la fonction quand c =0 car cette fonction est défini recursivement. On choisi par exemple la valeur 4.
//POST: la fonction retourne: (lucas(c-1))²-2.

#include


unsigned int lucas(unsigned int a) {

if (a==4)

{
return 0;
}

else return (lucas(a-1)*lucas(a-1))-2;
}

//mersenne function
//PRE: pas de précondition b est un usigned int
//POST: la fonction retourne 2^b-1

unsigned int mersenne(unsigned int b){

int result= 0;
int k=1;


for (unsigned int c=0; c>n;


unsigned int i=6; //j ai mis ca pcq lucas() est définie quand x=4.
unsigned int a = lucas (i-2);
unsigned int b = mersenne(i);

for (unsigned int i=6;n>=i; ++i)


if (a%b==0);


std::cout<<b<< "are prime numbers\n";


return 0;

}


Voila j espère que ca va, j ai mis mille commentaires pour que ca soit plus clair... peut etre que ca fait pas très pro mais de tt facon j essaie de tromper personne ;)
a+
Messages postés
8
Date d'inscription
mardi 24 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2009

j ai aussi essayé avec ton bout de code CptPingu

for(int i = 0; i <= n; ++i)
{
int a = fonction02(i - 2);
int b = fonction02(i);
if ((a / b) == 0)
std::cout << b << " est un nombre premier" << std::endl;
}

en remplacent / par %....
mais l output est aussi faux...
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
attention, ton for n'a pas d'accolades, c'est troublant (mais pourquoi pas?) , et il y a un point virgule à la fin du if (là c'est faux)

je suppose que tu veux mettre les définitions de a et b dans le for, et non pas avant;

à la 1ère itération, tu appelles lucas(4) qui vaut 0 or 0%b == 0 tout le temps.

utilise un débuger ou mets des traces car l'algoritme est bizarre

lucas(4) = 0
lucas(5) = -2 ! pas franchement un unsigned int
lucas(6) = 2

Finalement, je pense que ton algoritme est faux, tu devrais vérifier.

thip