Programme nombres premiers

I0o0I Messages postés 8 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009 - 2 déc. 2009 à 19:38
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 - 3 déc. 2009 à 19:23
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

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
3 déc. 2009 à 10:11
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.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
3 déc. 2009 à 10:38
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
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
3 déc. 2009 à 10:45
- 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 :)
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
3 déc. 2009 à 12:21
Désolé, CptPingu, je ne voulais pas te froisser, je m'adressais plutôt à I0o0I mais j'ai omis de le préciser.

thip
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
3 déc. 2009 à 12:22
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 !
0
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
3 déc. 2009 à 14:45
s'il est froissé, il repassera !
0
I0o0I Messages postés 8 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
3 déc. 2009 à 16:39
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+
0
I0o0I Messages postés 8 Date d'inscription mardi 24 novembre 2009 Statut Membre Dernière intervention 3 décembre 2009
3 déc. 2009 à 16:48
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...
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
3 déc. 2009 à 19:23
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
0
Rejoignez-nous