Partage
  • Partager sur Facebook
  • Partager sur Twitter

Calculer le PGCD

    12 juin 2008 à 20:10:07

    Bonjours !

    Aujourd'hui j'ai fais un programme pour calculer le PGCD. Premièrement, je voudrais que vous regardiez mon code est me dire comment l'amélioré ect... puis aussi je voudrais l'amélioré (cf bas de page)


    main.cpp :

    #include <iostream>
    #include "pgcd.h"
    
    
    
    using namespace std;
    
    int main()
    {
        int nombre1 = 0, nombre2 = 0, PGCD = 0, choix;
    
        cout << "**** Calcul du PGCD ****" << endl;
        cout << endl << endl << endl;
        cout << "Entrez le premier nombre :" << endl;
        cin >> nombre1;
        cout << "Entez le second nombre :" << endl;
        cin >> nombre2;
        cout << endl << "Voulez vous les details du calcul ?" << endl << "0.Non" << endl << "1.Oui" << endl;
        cin >> choix;
    
    
        PGCD = calculPGCD(nombre1, nombre2, choix);
        afficherPGCD(nombre1, nombre2, PGCD);
    
        return 0;
    }
    



    pgcd.cpp

    #include <iostream>
    #include "pgcd.h"
    
    using namespace std;
    
    int calculPGCD(int nombre1, int nombre2, int details)
    {
        int nombreReste = 56, nombreTemp1 = 0, nombreTemp2 = 0, PGCD = 0;
    
        nombreTemp1 = nombre1;
        nombreTemp2 = nombre2;
    
        //Calcul du PGCD de deux nombre envoyé en paramètre
        //Le troisième paramètre correspond a si on veut les détails ou pas
    
        if (details)
        {
            //On affiche la première ligne
            afficherDetails(0, 0, 0, 1);
            while (nombreReste !=0)
            {
                PGCD = nombreReste;
                nombreReste = nombreTemp1 % nombreTemp2;
                afficherDetails(nombreTemp1, nombreTemp2, nombreReste);
                nombreTemp1 = nombreTemp2;
                nombreTemp2 = nombreReste;
            }
        }
        else
        {
            while (nombreReste !=0)
            {
                PGCD = nombreReste;
                nombreReste = nombreTemp1 % nombreTemp2;
                nombreTemp1 = nombreTemp2;
                nombreTemp2 = nombreReste;
            }
        }
    
    
        return PGCD;
    }
    
    int afficherPGCD(int nombre1, int nombre2, int PGCD)
    {
        //On affiche le PGCD
        cout << endl << endl;
        cout << "Le PGCD des nombres " << nombre1 << " et " << nombre2 << " est :" << endl;
        cout << PGCD << endl;
    
    }
    
    int afficherDetails(int nombre1, int nombre2, int reste, int ligne1)
    {
        if (ligne1)
        {
            cout << "  a  |  b  |  r  |" << endl;
            cout << "     |     |     |" << endl;
        }
        else
        {
            cout << "  " << nombre1 << " |  " << nombre2 << " |  " << reste << " |" << endl;
        }
    
    }
    



    pgcd.h

    #ifndef DEF_PGCD
    #define DEF_PGCD
    
    int calculPGCD(int nombre1, int nombre2, int details);
    int afficherPGCD(int nombre1, int nombre2, int PGCD);
    int afficherDetails(int nombre1 = 0, int nombre2 = 0, int reste = 0, int ligne1 = 0);
    
    #endif
    




    Voila pour les codes !


    Mon problème est lorsque je choisi l'option détailler, la colone n'est pas droite :

    a  |  b  |  r  |
      1078  |  322  |  112  |
      322  |  112  |  98  |
      112  |  98  |  14  |
      98  |  14  |  0


    Comment programmer en fonction de la longueur des nombre faire une colone droite ? merci a vous !

    • Partager sur Facebook
    • Partager sur Twitter
      12 juin 2008 à 20:16:18

      Utilises les manipulateurs de flux. C.f. ma signature.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        12 juin 2008 à 20:21:55

        Parfait ! Sinon tu as regardé le code ?
        • Partager sur Facebook
        • Partager sur Twitter
          12 juin 2008 à 20:36:45

          Effectivement la méthode proposée par candide est on ne plus courte xD
          • Partager sur Facebook
          • Partager sur Twitter
            12 juin 2008 à 21:00:51

            Moi j'aime bien la version :

            unsigned int pgcd(unsigned int a,unsigned int b)
            {
                return (b==0) ? a : pgcd(b,a%b);
            }
            


            On pourrait même encore économiser des symboles

            unsigned int pgcd(unsigned int a,unsigned int b)
            {
                return b ?  pgcd(b,a%b) : a;
            }
            


            Mais ça devient moins clair.
            • Partager sur Facebook
            • Partager sur Twitter
            Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
              12 juin 2008 à 21:01:45

              On peut aussi le faire de manière récursive : voir ici.

              C'est en Python, mais en C++ ça donne ça :

              int pgcd (int a, int b)
              {
                 if (a % b == 0)
                      return b;
              
                 return pgcd (b, a % b);
              }
              


              Edit : grilled :D
              • Partager sur Facebook
              • Partager sur Twitter

              Live to learn and learn to live.

                12 juin 2008 à 22:01:52

                Je comprend pas grand chose de vos méthodes >_<
                • Partager sur Facebook
                • Partager sur Twitter
                  12 juin 2008 à 22:06:06

                  Citation : nicox11

                  Mon problème est lorsque je choisi l'option détailler, la colone n'est pas droite :

                  a  |  b  |  r  |
                    1078  |  322  |  112  |
                    322  |  112  |  98  |
                    112  |  98  |  14  |
                    98  |  14  |  0



                  Comment programmer en fonction de la longueur des nombre faire une colone droite ? merci a vous !



                  Je pense que tu peux t'en tirer en utilisant des tabulations ("\t") à la place des espaces.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juin 2008 à 7:36:25

                    Citation : Nanoc

                    Moi j'aime bien la version :

                    unsigned int pgcd(unsigned int a,unsigned int b)
                    {
                        return (b==0) ? a : pgcd(b,a%b);
                    }
                    



                    On pourrait même encore économiser des symboles

                    unsigned int pgcd(unsigned int a,unsigned int b)
                    {
                        return b ?  pgcd(b,a%b) : a;
                    }
                    



                    Mais ça devient moins clair.



                    Il faudrait écrire :

                    unsigned int pgcd(unsigned int a,unsigned int b)
                    {
                        return !b ?  pgcd(b,a%b) : a;
                    }
                    


                    plutot, puisque dans le premier cas on teste si b vaut 0, donc si b est faux. En tout cas les deux fonctions ne font pas la meme chose c'est sur.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 juin 2008 à 8:08:05

                      Citation


                      Il faudrait écrire :

                      unsigned int pgcd(unsigned int a,unsigned int b)
                      {
                          return !b ?  pgcd(b,a%b) : a;
                      }
                      



                      plutot, puisque dans le premier cas on teste si b vaut 0, donc si b est faux. En tout cas les deux fonctions ne font pas la meme chose c'est sur.



                      Non, non Nanoc à raison c'est :

                      unsigned int pgcd(unsigned int a,unsigned int b)
                      {
                          return b ?  pgcd(b,a%b) : a;
                      }
                      


                      Soit :

                      unsigned int pgcd(unsigned int a,unsigned int b)
                      {
                          return !b ?  a : pgcd(b,a%b);
                      }
                      


                      Mais ç'est encore moins clair et ça n'as pas trop d'intérêt. ^^

                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 juin 2008 à 18:23:31

                        effectivement, j'avais pas remarqué l'inversion des deux membres, je devais sans doute être fatigué.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Calculer le PGCD

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown