Problema algoritmo di Euclide C++ (M.C.D)

di il
8 risposte

Problema algoritmo di Euclide C++ (M.C.D)

Salve a tutti, sono nuovo del forum,(sono alle primissime armi) in genere evito di chiedere aiuto per un problema relativo alla programmazione (non per orgoglio, semplicemente vorrei provare a risolvere solo) ma in questo caso sto impazzendo, credo che a "livello semantico" il programma sia corretto ma non so perché non mi spunta il risultato. Vorrei precisare che: sono venuto a conoscenza del operatore "%" dopo aver scritto il programma ma anche senza di esso credo che funzioni.

#include <iostream>

using namespace std;

int main ()
{
  //variable declaration
  int A;
  int B;
  int C;
  int BoxA;
  int BoxB;

  //inputs

  std::cout << "Enter the first number" << '\n';
  cin >> A;
  std::cout << "Enter the second number" << '\n';
  cin >> B;

//in questo primo "if" faccio in modo che il numero più grande venga sottratto dal più piccolo
if (A<B)
{
  BoxA=A;
  B=A;
  BoxA=B;
}



  while (B!=0)
  {
    if (A>B)
    {
      C=A-B;
      C=A;
    } else
    {
      B=BoxB;
      C=B;
      BoxB=A;
    }



  }


  std::cout <<"The M.C.D is:"<< A << '\n';


}

8 Risposte

  • Re: Problema algoritmo di Euclide C++ (M.C.D)

    Perché così lungo? Sarebbero tre linee di codice...

    Comunque senza stare a guardare passi come risultato finale uno dei due numeri (A)
  • Re: Problema algoritmo di Euclide C++ (M.C.D)

    Weierstrass ha scritto:


    Perché così lungo? Sarebbero tre linee di codice...

    Comunque senza stare a guardare passi come risultato finale uno dei due numeri (A)
    In primis grazie per aver risposto.

    So che il programma potrebbe essere notevolmente ridotto utilizzando il modulo (%) ma essendo un principiante non ero a conoscenza di quest'ultimo qiundi mi sono arragianto con quello che sapevo.

    Per quanto riguardo l'ultimo passaggio la "A" è il MCD tra i due numeri se prendi (ad esempio)come input 32 e 11 MCD(32,11)=1 la "A" è 1 quindi il MCD.
    Cioè quello che voglio dire è che la A subisce variazione nel valore non gli passo direttamente l'input (o almeno credo)
  • Re: Problema algoritmo di Euclide C++ (M.C.D)

    Dopo il cin la A è sempre a destra nelle assegnazioni. Dubito che cambi valore
  • Re: Problema algoritmo di Euclide C++ (M.C.D)

    Weierstrass ha scritto:


    Dopo il cin la A è sempre a destra nelle assegnazioni. Dubito che cambi valore
    ok ho corretto le assegnazioni ma continua a non stampare. Non capisco, anche se in sè è banale il programma non riesco a capire
    
    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
      //variable declaration
      int A;
      int B;
      int C;
      int BoxA;
      int BoxB;
    
    
      //inputs
    
      std::cout << "Enter the first number" << '\n';
      cin >> A;
      std::cout << "Enter the second number" << '\n';
      cin >> B;
    
    //in questo primo "if" faccio in modo che il numero più grande venga sottratto dal più piccolo
    if (A<B)
    {
      BoxA=A;
      A=B;
      B=BoxA;
    }
    
      while (B!=0)
      {
        if (A>B)
        {
          C=A-B;
          A=C;
        } else
        {
          BoxB=B;
          B=C;
          A=BoxB;
        }
    
      }
    
    
      std::cout <<"The M.C.D is:"<< A << '\n';
    
    }
    
  • Re: Problema algoritmo di Euclide C++ (M.C.D)

    Il tuo codice ha molti errori. C non è inizializzato, quindi se parte dall'else hai un comportamento indefinito. Se parti da A=2 e B=1 entri in un loop infinito.

    Ha senso continuare con un codice sbagliato? Ora % lo conosci, prova con quello
  • Re: Problema algoritmo di Euclide C++ (M.C.D)

    Weierstrass ha scritto:


    Il tuo codice ha molti errori. C non è inizializzato, quindi se parte dall'else hai un comportamento indefinito. Se parti da A=2 e B=1 entri in un loop infinito.

    Ha senso continuare con un codice sbagliato? Ora % lo conosci, prova con quello
    Ho già fatto il programma utilizzando il modulo e funziona perfettamente.

    Volevo solo sapere in questo codice dove sto sbagliando o meglio dove stanno gli errori di semantica che ho fatto. Ho verificato quello che hai detto mettendo un cout dopo il while e mi stampa in loop 1, ma non riesco a capire dove sta l'errore. Potrebbe essere il fatto che il programma ha troppe assegnazioni ma ho controllato minuziosamente ogni singola assegnazione e non sembra essere errata o forse si ma non capisco dove. Inoltre che intendi che ha molti errori? ricadono esclusivamente sulle assegnazioni?

    Per quanto riguarda C è vero che non è inizializzato ma nel 2 if esso assume il valore di A-B quindi otterrà un valore lì credo
  • Re: Problema algoritmo di Euclide C++ (M.C.D)

    Perfetto risolto, mi sento al settimo cielo il problema stava nella condizione del if doveva essere messa >= altrimenti nell'ultima sotrazione accadeva un casino ossia l'if si ritrovava ad analizzare 1<1 quindi entrava nell'else dove sia BoxB, B, A, C si rimescolavano il loop con 1. Mi ha aiutato molto il cout che mi ha fatto individuare l'errore.

    ecco qui il codice corretto
    
    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
      //variable declaration
      int A;
      int B;
      int C=0;
      int BoxA;
      int BoxB;
    
    
      //inputs
    
      std::cout << "Enter the first number" << '\n';
      cin >> A;
      std::cout << "Enter the second number" << '\n';
      cin >> B;
    
    //in questo primo "if" faccio in modo che il numero più grande venga sottratto dal più piccolo
    if (A<B)
    {
      BoxA=A;
      A=B;
      B=BoxA;
    }
    
    while (B!=0)
      {
        if (A>=B)
        {
          
    
          C=A-B;
          A=C;
        } else
        {
    
    
          BoxB=B;
          B=C;
          A=BoxB;
        }
    
      }
    
    
      std::cout <<"The M.C.D is:"<< A << '\n';
    
    }
    
  • Re: Problema algoritmo di Euclide C++ (M.C.D)

    Se non mi ricordo male, quello che vuoi fare tu si fa in una riga di codice senza nessun altra variabile
    
    while(B) A>B ? A-=B : B-=A;
    
    Bene che hai debuggato, comunque
Devi accedere o registrarti per scrivere nel forum
8 risposte