Partage
  • Partager sur Facebook
  • Partager sur Twitter

algorithme d'euclide

l'application plante -_-'

Sujet résolu
    8 décembre 2005 à 22:16:55

    salut à tous,
    j'ai commencé le C avec les tutos de matheo donc j'suis encore débutant :p
    et vu que j'avais rien à faire j'me suis lancé dans la programmation de l'algorithme d'euclide
    mais mon programme plante, c'est pour tester par ce que j'imagine que le code du resultat final(si j'y arrive :-° )sera plus compliqué^^:

    Citation : Mon Code


    #include <cstdlib>
    #include <iostream>

    using namespace std;

    int main(int argc, char *argv[])
    {
    long v1;
    long v2;
    long v3;

    printf("entrez les deux nombres dont vous cherchez le PGCD\n");
    scanf("%ld%ld",&v1,&v2);
    do
    {
    v3 = v1 % v2;
    v2 = v2 % v3;
    }
    while(v1>0,v2>0,v3>0);

    printf("%ld\n",v2);


    system("PAUSE");
    return EXIT_SUCCESS;
    }<citation nom="Pas de titre">


    alors juste expliquez-moi mes erreurs mais me lachez pas l'code parce qu'après y'a plus de plaisir :D
    voila merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      8 décembre 2005 à 22:23:30

      http://www.ddx39.free.fr/Creations/Cpp/Sources/Algorithme%20d'Euclide%20%5BBy%20DDX39%5D.html
      • Partager sur Facebook
      • Partager sur Twitter
        8 décembre 2005 à 22:25:47

        merci de juste me lacher l'algorithme

        Citation : dOsSpr0uTosS

        alors juste expliquez-moi mes erreurs mais me lachez pas l'code parce qu'après y'a plus de plaisir :D
        voila merci d'avance

        • Partager sur Facebook
        • Partager sur Twitter
          8 décembre 2005 à 22:28:41

          C'est une erreur lors de la compilation ou lors de l'éxecution ?
          • Partager sur Facebook
          • Partager sur Twitter
            8 décembre 2005 à 22:30:32

            je rentre mes deux nombres,j'fais entrez et la ca plante ,c'st un erreur lors de l'execution je pense que c'est parce que j'utilise mal le do while :(
            tu peux m'expliquer vite fait
            Parce qu'enfaite je voudrais qu'il répète ces deux lignes de calculs jusqu'a qu'un des nombre soit égal a zero... :euh:
            • Partager sur Facebook
            • Partager sur Twitter
              8 décembre 2005 à 22:34:45

              while(v1>0,v2>0,v3>0);


              A remplacer par :

              while(v1>0 && v2>0 && v3>0);


              Et puis je capte pas c'est le reste qui doit être égal à zéro pas tous les nombres :/
              • Partager sur Facebook
              • Partager sur Twitter
                8 décembre 2005 à 22:37:06

                j'ai tester:

                Citation : CODE

                #include <cstdlib>
                #include <iostream>

                using namespace std;

                int main(int argc, char *argv[])
                {
                long v1;
                long v2;
                long v3;

                printf("entrez les deux nombres dont vous cherchez le PGCD\n");
                scanf("%ld%ld",&v1,&v2);
                do
                {
                v3 = v1 % v2;
                v2 = v2 % v3;
                }
                while(v2>0);j'ai aussi tester (v1>0||v2>0||v3>0);

                printf("%ld\n",v2);


                system("PAUSE");
                return EXIT_SUCCESS;
                }


                avec && ca plante aussi :/ enfaite et là j'vois pas trop ma faute ... o_O
                • Partager sur Facebook
                • Partager sur Twitter
                  8 décembre 2005 à 22:46:15

                  Essaye ça :


                  printf("entrez le premier nombre : ");
                  scanf("%ld",&v1);
                  printf("\nentrez le deuxieme nombre : ");
                  scanf("%ld",&v2);


                  Et puis je capte pas ton code :
                  v3 = v1 % v2;
                  v2 = v2 % v3;

                  Je suis pas sûr que ça soit l'algorithme d'Euclide o_O
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 décembre 2005 à 22:48:01

                    bah enfaite ca, ca peut marcher seulement si y'a que deux lignes(pour les nombre 493 et 377 il trouve le PGCD)
                    donc je repete l'opération jusuqu'a que v2 soit égal a 0 mais ca foire >_< je sais pas pourquoi!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 décembre 2005 à 23:58:24

                      Salut,

                      Suis pas certain non plus que ce soit la bonne formule...ou alors il est trop tard pour mon cerveau :lol:

                      En fait, le reste de la division devient le diviseur de la division suivante et le diviseur devient le dividende de la division suivante...c'est clair non :p

                      Sinon:

                      reste <- (dividende / diviseur)
                      pour la division suivante il faut permutter les valeurs
                      dividende <- diviseur
                      diviseur <- reste
                      et on continue tant que le reste est différent de 0.

                      Le dernier nombre avant 0 est le PGCD alias "Plus Grand Commun Dénominateur", notre ami qu'on aimeuuuu :lol:

                      Bonne nuit à tous
                      ++
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 décembre 2005 à 16:48:05

                        nan mais la formule j'la connait....
                        essai juste ces deux lignes de calcul avec les nombres 493 et 377 et tu verras ca march :-°
                        le problème c'est que je voudrais qu'il repete cette opération jusqu'a qu'une variable soit égale a zero et dès qu'elle l'est qu'il affiche sa valeur
                        c'est pour ca que j'me sert de la boucle do while mais l'appli plante pendant l'execution et je vois pas trop mon erreur o_O
                        euh j'viens d'me rendre compte qu'avec certain nombre il m'indique 0 et qu'avec d'autre il "reflechi"^^ puis plante
                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 décembre 2005 à 17:06:06

                          Vas pas chercher...

                          Voila le code, il est prévut pour tourner sous visual c++ 6.0



                          #include <stdio.h>
                          #include <stdlib.h>

                          void main (void)
                          {
                                  int x,y;
                                  int i, temps, pgcd;

                                  printf ("Entrez le prenier nombre: ");
                                  scanf ("%d",&x);
                                  printf ("Entrez le second nombre : ");
                                  scanf ("%d",&y);

                                  for (i=1 ; (x!=0)&&(y!=0) ; i++)
                                  {
                                          if (x<y)
                                          {
                                                  temps = x;
                                                  x = y;
                                                  y = temps;
                                          }
                                          if (x==y)
                                          {
                                                  pgcd = x;
                                          }
                                          x=x-y;
                                  }

                                  printf ("\nLe PGCD de ces deux nombre est %d.\n\n",pgcd);

                          }


                          Mainteant quelques adaptations serons néscésaire pour dev c++
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 décembre 2005 à 17:09:44

                            oula y'a moyen qu'tu donne des explication parce que là j'vois meme pas les calculs...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 décembre 2005 à 17:30:20

                              C'est pas bien compliqués, il s'agit de soustraction succèssives du plus grand nombre moin le plus petit nombre, dés que tu arrive à zéro, tu compte le nombre de soustraction...

                              Exemples:

                              X = 12
                              Y = 18

                              1. 18 - 12 = 6 (inverstion).
                              2. 12 - 06 = 6
                              3. 06 - 06 = 0

                              Alors?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 décembre 2005 à 21:07:00

                                j'pige toujours pas mais bon de toute faconca m'intéresse pas trop en fait mon problème c'est de savoir pourquoi mon prog march avec certain nombre et pas avec d'autre...
                                j'ai un peu et j'suis arrivé à ca:

                                Citation : CODE C++

                                #include <cstdlib>
                                #include <iostream>

                                using namespace std;

                                int main(int argc, char *argv[])
                                {
                                debut:;
                                long v1;
                                long v2;
                                long v3;
                                long v4;

                                printf("entrez les deux nombres dont vous cherchez le PGCD\n");
                                scanf("%ld%ld",&v1,&v2);
                                do
                                {
                                v3 = v1 % v2;

                                v4 = v2 % v3;
                                }
                                while(v4!=0);

                                printf("le PGDC de ces deux nombres est %ld\n",v4);
                                goto debut;

                                system("PAUSE");
                                return EXIT_SUCCESS;
                                }


                                alors là ca devrait marcher en théorie mais enfaite quand j'entre des nombre dont la division a comme reste 0 dès le premier calcule le programme plante mais ca c'est pas grave :p
                                en faite ce qui m'embète que quand j'rentre deux nombre avec lesquells ca devrait marcher(j'ai tester sur feuille leur pgcd etc..)et ben là...rien >_< enfaite il charge il charge et il charge argg
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  9 décembre 2005 à 23:37:36

                                  Salut,

                                  Citation

                                  j'pige toujours pas mais bon de toute faconca m'intéresse pas trop en fait mon problème c'est de savoir pourquoi mon prog march avec certain nombre et pas avec d'autre...



                                  C'est justement là qu'est le problème. Ton algorithme n'est pas bon.

                                  do
                                  {
                                  v3 = v1 % v2;

                                  v4 = v2 % v3;
                                  }
                                  while(v4!=0);


                                  Si v1 et v2 ne sont jamais modifié alors ta boucle tourne toujours avec les mêmes valeurs et v4 n'est jamais égal à 0. Exemple avec 493 et 377.

                                  Maintenant, si v3 est égal à 0 alors le programme plante. Exemple avec 8 et 4.

                                  Relis un peu les solutions des autres posts. cyberjk2003 t'a donné une solution et moi une autre.

                                  Citation : weiouch

                                  reste <- (dividende / diviseur)
                                  pour la division suivante il faut permutter les valeurs
                                  dividende <- diviseur
                                  diviseur <- reste
                                  et on continue tant que le reste est différent de 0.



                                  Mets tout ça dans le crâne, gigotes un peu et dis nous ce qui sort :lol:
                                  (C'est pas dis méchament, hein :p )

                                  ++
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 décembre 2005 à 23:40:26

                                    dsl mon algorithme n'était pas bon j'viens d'm'en rendre compte j'ai tout corriger et la ca devrait passer mais le programme plante...

                                    Citation : CODE C++

                                    #include <cstdlib>
                                    #include <iostream>

                                    using namespace std;

                                    int main(int argc, char *argv[])
                                    {
                                    debut:;
                                    long v1;
                                    long v2;
                                    long v3;
                                    long v4;

                                    printf("entrez les deux nombres dont vous cherchez le PGCD\n");
                                    scanf("%ld%ld",&v1,&v2);
                                    do
                                    {
                                    v3 = v1 % v2;

                                    v4 = v2 % v3;
                                    v4=v3;
                                    v1=v2;
                                    v2=v3;
                                    }
                                    while(v4!=0);

                                    printf("le PGDC de ces deux nombres est %ld\n",v4);
                                    goto debut;

                                    system("PAUSE");
                                    return EXIT_SUCCESS;
                                    }


                                    et je sais ce qu'est l'algorithme d'euclide ...
                                    je pense que mon erreur (dans le dernier code) viens du fait que je veux remplacer a cahque boucle les valeur de v1, v2, v3, et v4
                                    PS:juste pour expliquer mon erreur de t'leur enfaite ca creait une boucle et vu qu'il reprenait les meme valeur la boucle était infinies donc c'est pour ca qu'il chargeait sans rien repondre xD
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      10 décembre 2005 à 0:17:34

                                      Citation : cyberjk2003

                                      Vas pas chercher...


                                      for (i=1 ; (x!=0)&&(y!=0) ; i++)




                                      C'est quoi ce for ? Il n'a aucune utilité, utilise un while non ?


                                      while ( x!=0 && y!=0 )


                                      Enfin ça me parait plus logique ;)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        10 décembre 2005 à 2:32:04

                                        Bon j'ai bien reflechi et fais plein d'essai
                                        et j'trouve pas :p
                                        enfaite le truc c'est qu'a chaque que j'rajoute une variable ou que j'change l'égalité soit avec la boucle ca foire soit ca fait une boucle infinie >_<
                                        donc enfaite j'suis prenneur si y'a des gens qui ont du code C++ bien commenter...




                                        oula vais dormir moi :p
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          10 décembre 2005 à 11:02:38

                                          desolée j'ai pas reussi non plus
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            10 décembre 2005 à 14:05:27

                                            salut,
                                            voila enfaite j'ai trouver comment faire:
                                            enfaite c'est tout bète il suffit d'afficher les calculs et l'utilisateur trouve lui-meme le PGCD

                                            Citation : CODE C++

                                            #include <cstdlib>
                                            #include <iostream>

                                            using namespace std;

                                            int main(int argc, char *argv[])
                                            {
                                            debut:;
                                            int v1, v2, v3, v4;
                                            printf("entrez les deux nombres dont vous voulez le PGCD\n");
                                            scanf("%ld%ld",&v1,&v2);

                                            while(v4 != 0)
                                            {
                                            v4 = v1 % v2;
                                            v3 = v1 / v2;

                                            printf("%ld = %ld * %ld + %ld\n",v1,v3,v2,v4);

                                            v1 = v2;
                                            v2 = v4;
                                            }

                                            printf("le PGCD est le dernier reste non nul :D\n");
                                            goto debut;
                                            system("PAUSE");
                                            return EXIT_SUCCESS;
                                            }


                                            voila pour ceux que ca intéresse pour l'amélioré...
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              10 décembre 2005 à 14:56:24

                                              Citation

                                              enfaite c'est tout bète il suffit d'afficher les calculs et l'utilisateur trouve lui-meme le PGCD



                                              Moué pas forcement, moi sur celui que j'avais fait à l'époque c'est le prog qui affiche le PGCD, voilà la source :


                                              #include <cstdlib>
                                              #include <iostream>

                                              using namespace std;

                                              int main(int argc, char *argv[])
                                              {
                                                  long double complet;
                                                  long int entier, bouc, un, deux, change, reste=1, save1, save2;

                                                  debut:;
                                                  bouc=1;

                                              system("color f0");
                                              system("title Algorithme d'Euclide [By DDX39]");
                                              system("cls");

                                              printf("\nCe programme sert a trouver le PGCD (Plus Grand Commun Diviseur) de deux nombres");

                                              cout<<"\n\n Entrez le premier nombre : ";
                                              cin>>un;

                                              system("color f9");

                                              cout<<"\n Entrez le deuxieme nombre : ";
                                              cin>>deux;

                                              if (un == 0 && deux == 0) {

                                              cout<<"\nLes deux nombres sont egaux a 0, recommencez.";
                                              system("color fc");
                                              system("pause>nul");
                                              goto debut;

                                              }

                                              if (un == 0 || deux == 0 ) {

                                              cout<<"\nUn des deux nombres est egal a 0, recommencez.";
                                              system("color fc");
                                              system("pause>nul");
                                              goto debut;

                                              }

                                              save1 = un;
                                              save2 = deux;

                                              if (un < deux) {
                                                     change = un;
                                                     un = deux;
                                                     deux = change;
                                                     }

                                              entier = un / deux;
                                              reste = un % deux;
                                              cout<<"\n\n"<<bouc<<")   "<<un<<" / "<<deux<<" = "<<deux<<" x "<<entier<<" + "<<reste;
                                                     
                                                     while (reste != 0) {
                                              bouc++;
                                              un = deux;
                                              deux = reste;
                                              entier = un / deux;
                                              reste = un % deux;

                                              cout<<"\n"<<bouc<<")   "<<un<<" / "<<deux<<" = "<<deux<<" x "<<entier<<" + "<<reste;
                                              }
                                              system("color 79");

                                              cout<<"\n\n\n PGCD (\""<<save1<<"\";\""<<save2<<"\") =   "<<deux<<endl<<endl;

                                              cout<<"Le Plus Grand Diviseur Commun de \""<<save1<<"\" et de \""<<save2<<"\" est : \""<<deux<<"\"";

                                              system("pause>nul");
                                              goto debut;

                                              }



                                              Essaye le ;)
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                10 décembre 2005 à 17:11:10

                                                Je pense que le problème vient du programe en lui même.

                                                tu ecrit :

                                                while(c!=0)
                                                {
                                                c=a%b;
                                                a=b
                                                b=c
                                                }


                                                Mais rajoute une ligne a ton programe
                                                avant la boucle met c=a%b;
                                                car sinon la boucle ne marche pas car cest deja egale a 0

                                                Voila
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  10 décembre 2005 à 19:29:22

                                                  merci à tous,
                                                  ayait j'ai reussis, j'me suis inspiré du code de ddx39 :p

                                                  Citation : CODE C++


                                                  #include <cstdlib>
                                                  #include <iostream>

                                                  using namespace std;

                                                  int main(int argc, char *argv[])
                                                  {
                                                  debut:;
                                                  system("title Algorithme d'Euclide");
                                                  int v1, v2, v3, v4,v5,v6,v7;
                                                  printf("entrez les deux nombres dont vous voulez le PGCD\n");
                                                  scanf("%ld%ld",&v1,&v2);
                                                  if (v1==0 && v2==0)
                                                  {
                                                  printf("entrez des nombres non nuls\n\n");
                                                  goto debut;
                                                  }
                                                  if (v2==0||v1==0)
                                                  {
                                                  printf("entrez des nombres entiers\n\n");
                                                  goto debut;
                                                  }
                                                  v5=v1;
                                                  v6=v2;
                                                  v3 = v1 / v2;
                                                  v4 = v1 % v2;
                                                  printf("%ld / %ld = %ld * %ld + %ld\n",v1,v2,v2,v3,v4);
                                                  while(v4 != 0)
                                                  {
                                                  v2=v4;
                                                  v3 = v1 / v2;
                                                  v4 = v1 % v2;
                                                  printf("%ld / %ld = %ld * %ld + %ld\n",v1,v2,v2,v3,v4);
                                                  v7=v2;
                                                  v1 = v2;
                                                  v2 = v4;
                                                  }

                                                  printf("\nle PGCD de %ld et de %ld est le dernier reste non nul donc %ld :D\n\n",v5,v6,v7);
                                                  goto debut;
                                                  system("PAUSE");
                                                  return EXIT_SUCCESS;
                                                  }


                                                  voila l'code :D
                                                  erf j'viens d'me rendre compte que c'était exactement l'meme que celui de ddx39 apart qu'il est en C, j'avais pas fais gaffe vu qu'enfaite j'ai juste lu l'tien j'ai pas juste changer le langage .... :(
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 décembre 2005 à 20:23:26

                                                    Bonjour,

                                                    Je crois qu'on peut tout de même faire un poil plus simple ;)
                                                    Voilà mon code:


                                                    #include <stdlib.h>
                                                    #include <stdio.h>

                                                    int main()
                                                    {
                                                      int diviseur, dividende, reste;

                                                      printf("Entrez les deux nombres dont vous cherchez le PGCD\n");
                                                      printf ("Entrez le premier nombre: ");
                                                      scanf ("%d",&dividende);
                                                      printf ("Entrez le second nombre : ");
                                                      scanf ("%d",&diviseur);

                                                      if (diviseur != 0 && dividende != 0)
                                                      {
                                                          do 
                                                           {
                                                             reste = dividende % diviseur;
                                                             dividende = diviseur;
                                                             diviseur = reste;

                                                           } while(reste != 0) ;
                                                       
                                                          printf("Le PGCD est %d", dividende);
                                                      }
                                                      else
                                                      {
                                                          printf("Nombres differents de zero !\n");
                                                      }   
                                                       
                                                      getchar(); // "vide" le buffer
                                                      getchar(); // pause
                                                     
                                                      return 0;
                                                    }


                                                    Il est pas très complexe et il fonctionne...que demande le peuple ? :lol:
                                                    Maintenant, on peut utiliser les fonctions, les pointeurs et la récursivité...mais c'est pour plus tard :p

                                                    Bonne soirée à tous
                                                    ++
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      10 décembre 2005 à 20:34:05

                                                      d'ailleur j'viens de remarquer que l'mien chiait un peu avec certain nombre, doit y'avoir une tite erreur j'm'embrouille avec toutes ces v >_<
                                                      mais bon j'vais aranger ca en deux minutes :-°
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        10 décembre 2005 à 20:44:09

                                                        Re,

                                                        Justement, il faut que tu utilises des identificateurs plus "parlant" parce que avec de "V"...
                                                        Tu reconnais toi-même que tu t'embrouilles !

                                                        Bon courage :lol:
                                                        ++
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          10 décembre 2005 à 23:46:28

                                                          Citation : cyberjk2003

                                                          Vas pas chercher...

                                                          Voila le code, il est prévut pour tourner sous visual c++ 6.0
                                                          [...]
                                                          Mainteant quelques adaptations serons néscésaire pour dev c++


                                                          Gné? o_O
                                                          Le Cay est le même qu'elque soit l'IDE, c'est juste au niveau des librairie que ça change il me semble, mais la, c'est du stdio.h et math.h, donc des librairie standards...
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            11 décembre 2005 à 11:18:58

                                                            Un truc plus simple que ce que j'ai pu voir, je viens de le faire :

                                                            #include <stdio.h>
                                                            #include <stdlib.h>

                                                            int main(int argc, char *argv[])
                                                            {
                                                             
                                                              long nbrA  = 0;
                                                              long nbrB  = 0;
                                                              long reste = 1;
                                                              long multiple = 0;
                                                             
                                                             
                                                              printf("Nombre A => ");
                                                              scanf("%ld", &nbrA);
                                                              printf("Nombre B => ");
                                                              scanf("%ld", &nbrB);
                                                             
                                                              if (nbrB == 0) { printf("\n\aErreur : Division par 0 impossible..\n\n"); }

                                                              else
                                                              {
                                                               while (reste != 0)
                                                                 {
                                                                 multiple = nbrA / nbrB;
                                                                 reste = nbrA % nbrB;
                                                                   
                                                                 
                                                                 printf("\n\n Multiple : %ld \n Reste    : %ld \n\n", multiple, reste);
                                                                           
                                                                 nbrA = reste;
                                                                 nbrB = multiple;
                                                                 }
                                                                 
                                                                 printf("\n\n Le PGCD est : %ld \n\n" , nbrB);
                                                              }
                                                             
                                                             
                                                             
                                                              system("PAUSE");     
                                                              return 0;
                                                            }
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              12 décembre 2005 à 17:43:23

                                                              Salut,

                                                              Excusez-moi de faire remonter ce topic pourtant clos mais le dernier algorithme ne fonctionne pas!

                                                              Knarf2, c'est le reste qui devient diviseur et le diviseur devient dividende.
                                                              Dans ton code, le reste devient dividende...

                                                              Alors, avec nbrA à 14 et nbrB à 32 -> plantage !

                                                              ++
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              algorithme d'euclide

                                                              × 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