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

  FORUM HardWare.fr
  Programmation
  C++

  [HELP!]probleme dans mon programme

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[HELP!]probleme dans mon programme

n°1270933
jet-acide
ça fait mal!
Posté le 20-12-2005 à 17:23:03  profilanswer
 

Bon j'ai fait un petit programme qui est sensé déterminer si un nombre est premier ou pas...
Le problème est à l'intérieur de la boucle for...
Quand un nombre n'est ni divisible par 2, ni par 3, il se met en boucle ininterrompue et je trouve pas pourquoi!
(j'ai pas encore mis de quoi quitter mais ça n'a pas d'importance je le ferai + tard...)
 
A l'occaz une petite simplification ne se refuse pas... Mon script doit être bourré de fautes car C mon 1er prog en C++ et je n'ai jamais eu de formation  :(  
 

Code :
  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. float pairetset();
  4. float bcletest();
  5. float Nbre;
  6. float pairetest()
  7. {
  8. Nbre=0.00;   //j'initialise tout à 0 mais je me demande si c utile...
  9. cout << "Entrez un nombre : ";
  10. cin >> Nbre;
  11. float paire;
  12. paire=0;
  13. paire = Nbre / 2 ;
  14. if (int(paire) == paire) //cherche si Nbre est divisible par 2
  15. {
  16. cout << "div par 2 \n pas premier\n\n";
  17. pairetest(); //on sait qu'il n'est pas premier donc je relance le prog pour rentrer un nouveau nbre.
  18. }
  19. if (int(paire)!=paire)  //avec else ça marchait pas bien...
  20. {
  21. cout<<"pas div par 2 \n";
  22. bcletest(); //s'il n'est pas div. par 2, alors je lance le test avec tous les autres diviseurs possibles.
  23. }
  24. cout<<"erreur, arret du programme\n";
  25. return 0;
  26. }
  27. float bcletest()
  28. {
  29. float Nbred;
  30. Nbred=0;
  31. int divisr;
  32. divisr=0;
  33. for(divisr=3; divisr<Nbre; divisr+=2)
  34. {
  35. cout<<"diviseur : "<<divisr<<"\n";  //juste pour voir le comportement du prog tant qu'in n'est pas fini
  36. cout<<"nbre divisé : "<<Nbred<<"\n";
  37. Nbred=Nbre/divisr;
  38.   if (int(Nbred)==Nbred)
  39.   {
  40.   cout<<"pas premier\n\n";
  41.   pairetest();
  42.   }
  43.   if (divisr>Nbred)
  44.   {
  45.   cout<<Nbre<<" est premier!\n\n\n";
  46.   int main();
  47.   }
  48. }
  49. }
  50. int main()
  51. {
  52. cout<<"\n----------\nCe programme permet de savoir si un nombre (entier!) est premier ou non\n----------\n\n" ;
  53. pairetest();
  54.       system("PAUSE" );
  55.       return 0;
  56. }


 
Bon d'accord il est construit d'une drôle de façon, mais avec l'habitude ça ira mieux!
 
Alors qu'est-ce qui pose problème?  :??:

mood
Publicité
Posté le 20-12-2005 à 17:23:03  profilanswer
 

n°1270941
Profil sup​primé
Posté le 20-12-2005 à 17:35:13  answer
 

jet-acide a écrit :


Alors qu'est-ce qui pose problème?  :??:


 
Tout le code entre la ligne 1. et la ligne 60. (pour les autres lignes, ça va).
 
Achète toi un bon bouquin genre Accelerated C++ de Koenig & Moo ou télécharge Thinking in C++ de Bruce Eckel.

n°1270962
jet-acide
ça fait mal!
Posté le 20-12-2005 à 18:05:29  profilanswer
 

merci alerim de ta réponse rapide et directe... et ironique  xD (vaut mieux bien prendre cette 1ere réponse...)
 
Quelq'un n'aurait pas une réponse moins... "recommence tout T nul!"...?
 
//Pas la peine de répondre si c juste pour se foutre de moi!

n°1270963
jet-acide
ça fait mal!
Posté le 20-12-2005 à 18:08:42  profilanswer
 

"télécharge Thinking in C++ de Bruce Eckel."
 
Pour commencer je préfère un bouquin en français

n°1270964
Profil sup​primé
Posté le 20-12-2005 à 18:09:25  answer
 

Je me fous pas de toi, mais malheureusement c'est vrai, il n'y a pas une ligne de code qu'il faudrait pas complètement réécrire ! Ton truc ne compile pas, il y a des choses complètement inventées que tu n'as pu lire nul part et on ne programme pas en inventant, mais avec un vrai bon bouquin à côté de soit.
 
Dire ce qui ne va pas dans ton code ça serait te donner un cours complet tellement il y a de choses à dire. Donc le mieux c'est de te conseiller de lire un vrai bouquin sur le sujet, comme tous les vrais programmeurs l'ont fait un jour (et le font en permanence d'ailleur, un bouquin ça sert pas qu'aux débutants loin de là).

n°1270965
Profil sup​primé
Posté le 20-12-2005 à 18:12:58  answer
 

jet-acide a écrit :

"télécharge Thinking in C++ de Bruce Eckel."
 
Pour commencer je préfère un bouquin en français


 
Je ne sais pas s'il a été traduit mais si t'es pas capable de lire de l'anglais technique, tu vas pas aller loin en info (et l'anglais technique en info est loin d'être difficile).
 
Maintenant si tu veux pas faire d'effort, c'est ton problème. [:spamafote]

n°1270973
jet-acide
ça fait mal!
Posté le 20-12-2005 à 18:18:56  profilanswer
 

" il n'y a pas une ligne de code qu'il faudrait pas complètement réécrire ! Ton truc ne compile pas"
Je l'ai pourtant compilé et puis quand un nombre est divisible par 2 il marche tres bien...
Bon ok je n'insiste pas, je vais lire un bouquin complet, mais j'ai surtout besoin de bon exemples de programmes simples en C++
 
"te donner un cours complet" : si tu veux lol
 
STP dis-moi ce que j'ai "inventé" pour que je le refasse plus!

n°1270976
Profil sup​primé
Posté le 20-12-2005 à 18:23:13  answer
 

Si tu cherches des exemples de programmes en C++ tu peux trouver pleins de codes sources sur le net. Encore faut-il trouver des trucs écrits correctement et ça c'est pas gagné... Donc le mieux c'est un bouquin.
 
Sinon Google : filetype:cc ou filetype:cpp pour trouver des codes sources en C++. :)

n°1270979
theshockwa​ve
I work at a firm named Koslow
Posté le 20-12-2005 à 18:26:53  profilanswer
 

[:pingouino] c'est quoi ce titre de topic ?
 
(et sinon, "le premier langage à apprendre est l'anglais" est une phrase incontournable sur ce forum)

n°1270980
masklinn
í dag viðrar vel til loftárása
Posté le 20-12-2005 à 18:30:30  profilanswer
 

A première vue, alerim a raison, la première erreur est au niveau conceptuel: toute l'algorithmique est à refaire.
 
Exemple:

  • Pourquoi utilises tu des flottants? depuis quand un nombre premier peut-il être autre chose qu'un entier [:petrus dei]
  • Pourquoi un cas spécifique pour savoir si ton nombre est pair (pas de e)(en plus le test est franchement crade, il y a de bien meilleures manières de tester la parité), qu'a le nombre "2" de spécial à part le fait d'être le premier premier [:petrus dei]
  • Super l'incrémentation de la boucle de 2 à chaque tour, ça optimise grave, sauf que
Citation :

Premature optimisation is the root of all evil


Avant de te soucier d'optimiser, commence déjà par faire marcher ton truc.
 
Accessoirement, si t'es en C++ tu es censé inclure <iostream>, pas <iostream.h>


Message édité par masklinn le 20-12-2005 à 18:31:12

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
mood
Publicité
Posté le 20-12-2005 à 18:30:30  profilanswer
 

n°1270994
jet-acide
ça fait mal!
Posté le 20-12-2005 à 18:46:36  profilanswer
 

Je me suis inspiré du même programme que j'avais fait en... TI Basic
(Le C++ sur ordi est plus rapide  qu'une calculatrice)
Sauf qu'il était nikel en TI Basic, mais dur à transcrire en C++ quand on y connait rien...
 
flottants : d'accord int est mieux mais c au cas ou qqn rentre 1 nombre à virgule : je veux pas que mon prog dise que 5.2 est premier bar ex...
 
<iostream.h> : include mis par défaut par mon compileur (devCpp)

n°1271039
theshockwa​ve
I work at a firm named Koslow
Posté le 21-12-2005 à 09:17:35  profilanswer
 

jet-acide a écrit :

Je me suis inspiré du même programme que j'avais fait en... TI Basic
(Le C++ sur ordi est plus rapide  qu'une calculatrice)
Sauf qu'il était nikel en TI Basic, mais dur à transcrire en C++ quand on y connait rien...
 
flottants : d'accord int est mieux mais c au cas ou qqn rentre 1 nombre à virgule : je veux pas que mon prog dise que 5.2 est premier bar ex...
 
<iostream.h> : include mis par défaut par mon compileur (devCpp)


 
traduire du code d'un langage à un autre n'est jamais quelque chose de conseillé. En général, la manière d'écrire peut varier assez fortement suivant ce que le langage te propose. Donc à la limite, si tu veux porter ton programme, reprends depuis le début. Tu sais ce qu'il fait, donc tu peux le refaire.
 
le problème pour ton nombre flottant, c'est aussi que l'utilisateur pourra rentrer une valeur qui fera entrer ton programme dan,s une boucle infinie au vu de sa construction actuelle (par exemple une valeur flottante représentant un nombre supérieur à 2^32+2)
 
ton compilateur ne te met pas ce genre de header par défaut. Il se peut, par contre, que ton IDE t'en mette, mais effectivement, <iostream.h> est un header obsolète depuis déjà un bon nombre d'années. On utilise <iostream> depuis longtemps, maintenant

n°1271068
durkheim
Posté le 21-12-2005 à 10:25:51  profilanswer
 

Bon j'ai fait cet algo à l'arrache sans compiler, il est largement optimisable, mais c'est une mailleure base non?
 
int verif_premier (unsigned int nb)
{
   int diviser;
   int trouve = 0;
   for (diviser = 2; diviser <= sqrt(nb,2), trouve == 0; diviser++)
  {
     if (nb%diviser == 0) //reste de la division = 0
     {
        trouve = 1;
     }
  }
  return (trouve == 0)
}
 
Retourne 1  si il est premier, 0 sinon...

n°1271072
theshockwa​ve
I work at a firm named Koslow
Posté le 21-12-2005 à 10:33:30  profilanswer
 

alors, sans prendre en compte la notion d'optimisation :
 
* si tu retournes une valeur genre 0 ou 1 -qui a clairement vocation d'être un booléen-, alors pourquoi utiliser un int ?
* le ++ devrait être préfixé sans même parler d'optimisation
* tu aimes faire des tours de boucle inutile ? au lieu de faire trouve = 1, retourne false directement

n°1271075
durkheim
Posté le 21-12-2005 à 10:35:29  profilanswer
 

Si on prend pas en compte la notion d'optiomisation, alors tes remarques n'ont pas lieu d'être. Le préfixage de ++ n'a aucune importance, et pour le reste, j'ai l'habitude de coder en C, et j'ai fait cet algo à l'arrache viteuf, comme précisé d'ailleurs. (en passant, en C les booléesn sont codés comme des int, alors à la rigueur c'est même mieux ^^, et je ne fais pas de tour de boucle en plus qu'avec ta méthode. Deux ou trois cafés de trop?)

Message cité 1 fois
Message édité par durkheim le 21-12-2005 à 10:37:39
n°1271080
theshockwa​ve
I work at a firm named Koslow
Posté le 21-12-2005 à 10:40:34  profilanswer
 

durkheim a écrit :

Si on prend pas en compte la notion d'optiomisation, alors tes remarques n'ont pas lieu d'être. Le préfixage de ++ n'a aucune importance, et pour le reste, j'ai l'habitude de coder en C, et j'ai fait cet algo à l'arrache viteuf, comme précisé d'ailleurs. (en passant, en C les booléesn sont codés comme des int, alors à la rigueur c'est même mieux ^^, et je ne fais pas de tour de boucle en plus qu'avec ta méthode. Deux ou trois cafés de trop?)


 
on fait pas de C ici, merci de sortir [:dawa]
et mes remarques que tu as l'air de considérer comme des optimisations sont simplement des remarques de bon sens. (Qui plus est, optimiser sans tenir compte du contexte d'utilisation, c'est assez moyen)
 
désolé pour ma remarque sur les tours en trop, effectivement, tu n'en fais pas, c'est juste la condition du for qui n'est pas vraiment naturelle [:pingouino]

n°1271083
durkheim
Posté le 21-12-2005 à 10:43:43  profilanswer
 

Ok, ok, remarques acceptées. Voila une nouvelle mouture, C++ compliant:
 
bool verif_premier (unsigned int nb)
{
   int diviser;
   int trouve = 0;
   for (diviser = 2; diviser <= sqrt(nb,2), trouve == 0; diviser++)
  {
     if (nb%diviser == 0) //reste de la division = 0
     {
        trouve = 1;
     }
  }
  return (trouve == 0);
}  
 
Bon, comme tu vas encore trouver à y redire, je te propose de poster une fonction similaire en améliorant celle ci, et je ferai de même. Au lieu de 4 posts inutiles, on aura ptêt un prog pour le posteur.

n°1271099
theshockwa​ve
I work at a firm named Koslow
Posté le 21-12-2005 à 10:59:13  profilanswer
 

bah, le posteur n'a pas l'air particulièrement intéressé par l'idée d'avoir une solution toute faite, non ? [:pingouino] apparamment, il fait ca pour prendre en main le langage
 
sinon, l'algo en lui-même, comme tu l'as prouvé dès ta première intervention, n'est pas d'une difficulté insurmontable si on veut juste quelque chose de "fonctionnel", donc bon ...

n°1271207
Malkav
Posté le 21-12-2005 à 13:18:32  profilanswer
 

tant qu'on y est a parler d'optimisation c'est ridicule de faire un sqrt() a chaque itération !!!!!! et çà mange certainement plus de cycles que le résultat temporraire inutile ;)
 
Ma petite version:

Code :
  1. bool isPrimeNumber (unsigned long nb)
  2. {
  3.    long diviser;
  4.    const long maxDiviser = (long) sqrt((double)nb); // include <math.h>
  5.    for (diviser = 2; diviser <= maxDiviser ; ++diviser)
  6.    {
  7.      if (nb%diviser == 0) //reste de la division = 0
  8.         return false;
  9.   }
  10.   return true;
  11. }


 
Après evidemment on peut optimiser, en effet les seuls diviseurs a tester sont les autres nombres premiers, du coup ton optim de n'utiliser que les impairs a partir de 3 marche pas mal.


Message édité par Malkav le 21-12-2005 à 13:25:19
n°1271212
Malkav
Posté le 21-12-2005 à 13:22:02  profilanswer
 

le int main() ligne 49 est horrible, fait une boucle dans ton main qui lit l'entrée et appelle la méthode de test, méthode qui renvoie un bool et qui n'affiche rien... c'est ds la boucle du main que tu vas faire l'affichage selon le résultat de la fonction
 
pour ton souci ds la boucle, as tu tracé au moins ? en mode debug tu devrais vite trouver le porblème ;)
(tu compiles avec koi ?)

Message cité 1 fois
Message édité par Malkav le 21-12-2005 à 13:23:39
n°1271265
theshockwa​ve
I work at a firm named Koslow
Posté le 21-12-2005 à 14:15:23  profilanswer
 

Malkav a écrit :

le int main() ligne 49 est horrible


 
 
c'est pas que c'est horrible, c'est surtout que ca déclare une fonction, la ligne est donc parfaitement inutile
 
ensuite, non, on ne s'occupe pas d'optimiser, justement [:pingouino]
si la fonction avait réellement besoin d'être optimisée, ca sous-entendrait qu'elle serait un point critique de l'application, donc qu'elle serait appelée souvent. Auquel cas on pourrait préférer stocker les différents nombres premiers qu'on a pu rencontrer afin de les réutiliser pour les calculs suivants, par exemple ... donc ce n'est pas de ca qu'on s'occupe ici

n°1271334
Elmoricq
Modérateur
Posté le 21-12-2005 à 15:16:58  profilanswer
 

Code :
  1. if (int(paire)!=paire)  //avec else ça marchait pas bien...


[:rofl]
 

  • quand une instruction, surtout si elle est élémentaire, donne des résultats aléatoires, alors ça vient du code, pas du langage.


  • on ne teste jamais deux nombres flottants avec == ou !=, à cause de l'imprécision des floats (lire des cours sur le sujet, c'est très important à savoir)


  • revoir le principe des casts

n°1271481
jet-acide
ça fait mal!
Posté le 21-12-2005 à 18:36:09  profilanswer
 

Bon merci de vous interesser à mon prog, aussi pitoyable soit-il!
Je vais effectivement retenir vos conseils (ne teste jamais deux nombres flottants avec == ou !=...) et je vais me mettre sérieusement au C++ avec 1 bon bouquin (et les cours de l'IUT qu'on m'a passé)
 
Je n'ai utilisé que "Dev-C++ 4" (en anglais) -un vieux truc quoi! :D  
 
Je cherchais à faire ce prog : pour me faire au C++ déjà; mais aussi parce-que ce programme m'intéressait! (je veux dire que je voulais avoir un prog qui me permette de trouver des nombres premiers ou les facteurs premiers d'un nombre). C vrai qu'on peut en trouver sur le net, mais je voulais le faire moi-même.
 
Je trouve assez inutile de tester la division avec les nombres pairs ( càd 1 sur 2!!), car c'est une opération totalement inutile  quand on sait s'il est lui-m pair ou non!!!
//maintenant si c pas encore à ma portée de faire une boucle à incrémentation de 2... c 1 autre probl.
Cette optimisation (j'appelle même pas ça 1 optimisation...) est importante si le nombre entré est très grand. (d'autant plus que c'est la seule existante -mis à part faire une boucle la plus concise possible...)
De nombreux chercheurs planchent là dessus et l'algo le + puissant est basé sur ça / ils ont trouvé des trucs ms c plus de la prog (HS) et c trop compliqué!)
 
Enfin la boucle peut s'arrêter lorsque le diviseur == racine carrée du nombre entré.
???1? comment on fait les racines en C++ ???
???2? Je sais qu'on peut utiliser goto mais je sais pas comment on definit un label!  
???3? Quelle est la syntaxe exacte de la boucle for ? (je vois pas ce qui empêche d'incrémenter 2...)
 
--Merci--

n°1271662
theshockwa​ve
I work at a firm named Koslow
Posté le 22-12-2005 à 10:10:48  profilanswer
 

1 : std::sqrt pour la racine en C++, j'imagine (je n'ai pas vérifié)
 
2 : l'utilisation de goto est une mauvaise habitude que tu as pu avoir avec ta calculatrice, normalement, tu ne devrais en avoir besoin que dans de très rares cas. Sinon, la déclaration d'un label se fait de la manière suivante :
nom_label:
 
3 : for( intialisation ; condition ; incrémentation) instruction à répéter
donc oui, rien ne t'empêche d'incrémenter de 2 en 2, simplement, le fait de faire ca induit que tu es en train de chercher à optimiser et la remarque plus haut portait plutôt sur ce fait ... On ne cherche pas à optimiser un algo bancal :/
 
(Edit : AMHA, les chercheurs ne vont pas s'amuser à entrer un à un les nombres qu'ils soupçonnent être premiers, donc l'approche de ton programme est déjà contestable si c'est là sa vocation)


Message édité par theshockwave le 22-12-2005 à 10:12:57
n°1271847
Malkav
Posté le 22-12-2005 à 15:15:52  profilanswer
 

shockwave, quand on parle d'optimisation c'est pas juste en stockant un résultat de calcul, là c meme pas de l'optimisation c'est du bon sens, et une bonne habitude à prendre. on n'est pas obligé de faire expres de pondre du code lent qd meme.
 
jet-acide : tu as tout a fait raison, il est inutile de tester avec les nb pairs...
 
pour la racine carrée ben j'ai mis un exemple, lit le, sinon la méthode c'est

Code :
  1. double sqrt( double x )


dans math.h
 
Pour sortir d'une boucle pas de goto mais un break, mais pas la peine si tu peux retourner direct le résultat
 
sinon çà donne par exemple un truc du genre :

Code :
  1. bool isPrime(int nb)
  2. {
  3. bool prime = true;
  4. if (nb%2 != 0) // ou if (i&0x00000001) qui test juste le bit de poids faible
  5. {
  6. const int maxtest = (int) sqrt((double)nb);
  7. for (int i = 3 ; i < maxtest ; i+=2)
  8. {
  9.    if (nb%i == 0)
  10.   {
  11.      prime = false;
  12.      break;
  13.   }
  14. }
  15. }
  16. return prime;

Message cité 1 fois
Message édité par Malkav le 22-12-2005 à 15:17:21
n°1271874
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-12-2005 à 15:44:21  profilanswer
 

moi je vote, le C# c'est mieu.
 
et au moins, une abération du style :
int truc()
{
  return false;
}
 
au moins ça compile pas en C#... quand je vois ça dans un programme C/C++, j'ai envie de noyer son auteur :o

Message cité 1 fois
Message édité par Arjuna le 22-12-2005 à 15:44:45
n°1271879
Elmoricq
Modérateur
Posté le 22-12-2005 à 15:58:01  profilanswer
 

Arjuna a écrit :

au moins ça compile pas en C#... quand je vois ça dans un programme C/C++, j'ai envie de noyer son auteur :o


 
Euh, non, return false en C, ça n'existe pas. En C++ à la rigueur...  [:petrus75]

n°1271888
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-12-2005 à 16:05:01  profilanswer
 

Ouais, m'enfin le C me permettra quand même de faire un return 'e' alors que ma fonction est censée retourner un Int...

n°1271894
theshockwa​ve
I work at a firm named Koslow
Posté le 22-12-2005 à 16:07:27  profilanswer
 

oui, mais 'e' est une valeur entière, non ? [:petrus75]

n°1271898
Elmoricq
Modérateur
Posté le 22-12-2005 à 16:10:22  profilanswer
 

Arjuna a écrit :

Ouais, m'enfin le C me permettra quand même de faire un return 'e' alors que ma fonction est censée retourner un Int...


 
En C, 'e' est un int...

n°1271905
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-12-2005 à 16:26:53  profilanswer
 

c'est bien ça le problème :o

n°1271906
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-12-2005 à 16:27:15  profilanswer
 

Le C n'est pas typé. C'est qu'une surcharge bien pourrie de l'ASM en fait.

n°1271915
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-12-2005 à 16:34:14  profilanswer
 

En tout cas, en C# ça marche pas trop mal...
 

Code :
  1. private void button1_Click(object sender, System.EventArgs e)
  2.  {
  3.   Int64 nombre = 0;
  4.   try
  5.   {
  6.    nombre = System.Convert.ToInt64(textBox1.Text, 10);
  7.   }
  8.   catch
  9.   {
  10.    MessageBox.Show("Vas-y mon gars, tape un nombre entier, tu vas finir par y arriver" );
  11.   }
  12.   if (nombre != 0)
  13.   {
  14.    DateTime start = DateTime.Now;
  15.    string ret = zeCodeKiTue(nombre);
  16.    TimeSpan fin = DateTime.Now.Subtract(start);
  17.    MessageBox.Show(String.Format("{0}\nTrouvé en {1}", ret, fin.ToString()));
  18.   }
  19.  }
  20.  protected string zeCodeKiTue(Int64 nombre)
  21.  {
  22.   const string PREM = "Ton nombre est premier, c'est bien mon gars";
  23.   const string PASPREM = "Ton nombre est divisible par : {0} DTC";
  24.   Int64 nbMax = (Int64)Math.Sqrt((double)nombre);
  25.   if (nombre%2 == 0)
  26.   {
  27.    return String.Format(PASPREM, 2);
  28.   }
  29.   for (Int64 i = 3; i <= nbMax; i+=2)
  30.   {
  31.    if (nombre%i==0)
  32.     return String.Format(PASPREM, i.ToString());
  33.   }
  34.   return PREM;
  35.  }


 
1234567890123456817 => 44 secondes pour trouver que c'est un nombre premier sur un Pentium M 1.5 GHz :)

n°1271938
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-12-2005 à 16:52:45  profilanswer
 

C'est bien bête : "decimal" ne marche pas avec la fonction double Math.Sqrt(double a)
 
Parceque "1234567890123456817", c'est le nombre maximum de chiffres d'un entier 64 bits (j'aurais pu utiliser non signé, m'enfin ça n'aurait pas changé grand chose).
decimal aurait dû permettre d'utiliser des nombres avec au moins le double de chiffres :spamafote:
en tout cas, "1234567890123456817" dans un double (ou un float, ça revient au même) c'est marrant : y'a trop de chiffres et du coup ça dépasse sa précision. ainsi, 1234567890123456817%2 = 0 :D

n°1271982
theshockwa​ve
I work at a firm named Koslow
Posté le 22-12-2005 à 17:41:54  profilanswer
 

tu vas arrêter, avec ton C#, oui ? :o

n°1271992
Arjuna
Aircraft Ident.: F-MBSD
Posté le 22-12-2005 à 17:50:21  profilanswer
 

ben quoi ? c'est mieu, j'y peut rien :ange:

n°1272011
theshockwa​ve
I work at a firm named Koslow
Posté le 22-12-2005 à 18:20:06  profilanswer
 

je ne dirais pas mieux, loin de là [:pingouino]
 
certes, c'est pratique, mais c'est loin d'être adapté à tous les traitements :o
 
Edit : Et ... bordel, on est dans la cat C++ pour un mec qui apprend le C++, donc pas de C# ici


Message édité par theshockwave le 22-12-2005 à 18:20:49
n°1272028
jet-acide
ça fait mal!
Posté le 22-12-2005 à 18:38:27  profilanswer
 

Malkav j'avais lu mais j'avais pas compris sqrt...
merci pour ton code. :)
 
Shockwave : le but des recherches (pas le mi1) est :  
 -Tu renrte une cléf publique (cryptographie) qui est : nombre=(nbre_premier1_128bits*nbre_premier2_128bits)
 -Ton prog miraculeux te trouve ces 2 multiplicateurs dont l'un est la cléf de décryptage
 -Tu décrypte le message sensé être "inviolable" (genre RSA).
Un algo en C/C++ ne peut pas trouver ça en moins de quelques années... (Avec les + gros cluster -non quantiques- du monde) !
Mais les nbres premiers m'ont tjr interessés.
 

n°1272039
theshockwa​ve
I work at a firm named Koslow
Posté le 22-12-2005 à 19:03:58  profilanswer
 

oui, donc tu n'entres pas les nombres premiers à la main ... tu fais un générateur de nombres premiers sur 128 bits, CQFD, tu es mal parti dans ce que tu veux faire, même si ca a pour but de te faire la main sur le langage
(et sinon, ne t'inquiète pas, j'ai fait un peu de crypto pendant mes cours :o )

n°1272936
masklinn
í dag viðrar vel til loftárása
Posté le 24-12-2005 à 16:08:38  profilanswer
 

Malkav a écrit :

là c meme pas de l'optimisation c'est du bon sens


C'est extrèmement discutable, ça rend le code moins lisible en n'apportant peu ou prou rien en terme de vitesse de calcul.

Malkav a écrit :

une bonne habitude à prendre. on n'est pas obligé de faire expres de pondre du code lent qd meme


Non, utiliser des constructions rapides pourquoi pas, mais ce genre d'optimisations à la con, pas avant d'avoir fait tourner un profiler sur le code pour vérifier que ça fume vraiment les perfs, et (surtout) pas avant d'être sûr que l'algo actuel est le meilleur disponible et que les performances sont insuffisantes

mood
Publicité
Posté le   profilanswer
 


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

  [HELP!]probleme dans mon programme

 

Sujets relatifs
[oracle/pl/sql] problème triggerProblème de callback avec array_map dans une classe
[XSLT]probleme avec les ':'probleme de guillemet je pense ....
Probleme de mainConstructeur destructeur probleme avec heritage
problème pour passer un flux en argument d'une fonction[VBA EXCEL 03] Probleme de mise en forme auto du graph
Problème execution VB Script en ASPProblème bizarre sur un programme en batch! help!
Plus de sujets relatifs à : [HELP!]probleme dans mon programme


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