Programma mcm e mcd tra 3 numeri

di il
16 risposte

Programma mcm e mcd tra 3 numeri

Buonasera ragazzi dovrei realizzare un programma che mi calcoli l’mcm e l’MCD tra 3 numeri inseriti in input.
Ho pensato di utilizzare l’algoritmo di Euclide per calcolarmi l’mcm e l’mcd di due numeri e confrontarli a due a due con un if per capire poi quale fosse l’mcm e l’mcd dei 3 numeri inseriti.
Per fare questo ho trovato una funzione apposita che calcola direttamente mcm e mcd passandogli due valori
Std: :gcd e Std:lcm
Dunque ho cominciato a scrivere il codice
<code>
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;

int main()
{
int a,b,c,mcd,mcm;
cout<<"inserisci il primo numero ";cin>>a;
cout<<"inserisci il secondo numero ";cin>>b;
cout<<"inserisci il terzo numero ";cin>>c;
//calcolo mcd
if ((std::__gcd(a,b))<(std::__gcd(b,c)))
{
mcd=std::__gcd(a,b);
}
else if ((std::__gcd(b,c))<(std::__gcd(a,b)))
{
mcd=std::__gcd(b,c);
}

else{
mcd=std::__gcd(a,c);
}
//calcolo mcm
if ((std::__lcm(a,b))>(std::__lcm(b,c)))
{
mcm=std::__lcm(a,b);
}
else if ((std::__lcm(b,c))>(std::__lcm(a,c)))
{
mcm=std::__lcm(b,c);
}

else{
mcm=std::__lcm(a,c);
}
//stampa risultati
cout<<"l'M.C.D tra i numeri inseriti e: " << mcd;
cout<<"l'm.c.m tra i numeri inseriti e: " << mcm;
return 0;
}
</code>
Perfetto...mi sono informato e ho provato a fare il programma. Std: :gcd me lo fa usare tranquillamente e l’mcd tra tre numeri me lo calcola precisamente ma std: :lcm non me lo fa utilizzare e mi da questo errore “lcm is not a member of std” SAPETE COME AIUTARMI?

16 Risposte

  • Re: Programma mcm e mcd tra 3 numeri

    Dovresti usare l'include di <numeric> e gcd lcm

    Ma secondo me chi ti ha dato l'esercizio non vorrebbe che tu usassi funzioni di libreria
  • Re: Programma mcm e mcd tra 3 numeri

    Ho provato anche a pensare diversamente. Ma non riesco a trovare una soluzione
  • Re: Programma mcm e mcd tra 3 numeri

    Ho pensato di scrivermi proprio l’algoritmo di Euclide e raggrupparli sempre a due a due ma il programma verrebbe troppo lungo
  • Re: Programma mcm e mcd tra 3 numeri

    Lungo? Se è un compito al professore non importa
  • Re: Programma mcm e mcd tra 3 numeri

    Non viene lungo, se abbiamo n1 e n2, per il MCD il ragionamento è: devo sottrarre il numero minore al numero maggiore finquando i due numeri diventano uguali.
    Per il mcm moltiplico n1 con n2 e il risultato lo divido per il MCD.
    
    #include <stdio.h>
    int MCD(int n1, int n2);
    int mcm(int n1, int n2);
    int ps=0;
    
    int main()
    {
        int n1, n2;
    
        printf("MCD e mcm tra due numeri\n\n");
    riinput:
    
        ps=0;
        printf("Inserisci il primo numero: ");
        scanf("%d", &n1);
        printf("inserisci il secondo: ");
        scanf("%d", &n2);
    
        printf("\nMCD %d\n", MCD(n1,n2));
        printf("mcm %d\n" , mcm(n1,n2));
        printf("iterazioni %d\n",ps);
        printf("\n-------------------------------\n");
        goto riinput;
    }
    
    int MCD(int n1, int n2)
    {
        while (n1!=n2)
        {
            if (n1<n2)
            {
                n2=n2-n1;
                ps+=1;
            }
            else
            {
                n1=n1-n2;
                ps+=1;
            }
        }
        return n1;
    }
    
    int mcm(int n1, int n2)
    {
        ps+=1;
        int valore = n1*n2/MCD(n1,n2);
        return valore;
    }
    
    In un algoritmo del genere (Euclide), contano le iterazioni, nella variabile ps (passi) quanti cicli vengono fatti per raggiungere il risultato, se scriverai un altro algoritmo (Adrianorto), potrai controllarne l'efficienza contando le sue iterazioni, Il codice è in C, per i tre numeri già sai come fare.
  • Re: Programma mcm e mcd tra 3 numeri

    [CODE] #include <iostream> #include <string> #include <cmath> using namespace std; int main(){ int i,c; //i=contatore MCD c=contatore mcm int num1,num2,num3,min,max; cin>>num1; cin>>num2; cin>>num3; //calcolo MCD if (num1<num2){min=num1;} else {min= num2;} if (num3<min){min=num3;} for(i=min;i>=1;i--){ if( num1%i==0 and num2%i==0 and num3%i==0){ cout<<i<<endl; break; } } //calcolo mcm max=num1*num2*num3; for(c>=1;c<=max;i++){ if( num1%c==0 and num2%c==0 and num3%c==0){ cout<<c; break; } } return 0; } Oggi ho ripreso un po’ il programma, e ho fatto questo for per calcolarmi l’MCD e sembra calcolarlo bene. Per quanto riguarda l’mcm ho provato a fare quel for li ma non mi stampa alcun risultato, credo sia sbagliato. Sapete aiutarmi?
  • Re: Programma mcm e mcd tra 3 numeri

    Che significa questa riga?
    
     for(c>=1;c<=max;i++)
    
    volevi scrivere:
    
    for(c=1;c<=max;c++)
    
    MCD funziona, mcm basta correggere il codice:
    
    #include <iostream>
    #include <string>
    #include <cmath>
    using namespace std;
    int main(){
        int i,c=0; //i=contatore MCD c=contatore mcm
        int num1,num2,num3,min,max=0;
        cin>>num1;
        cin>>num2;
        cin>>num3;
        //calcolo MCD
        if (num1<num2){min=num1;}
        else {min= num2;}
        if (num3<min){min=num3;}
    
        for(i=min;i>=1;i--){
            if( num1%i==0 and num2%i==0 and num3%i==0){
            cout<<i<<endl;
            break;
            }
        }
    
        //calcolo mcm
        max=num1*num2*num3;
        for(c=1;c<=max;c++){
            if( c%num1==0 & c%num2==0 & c%num3==0){
            cout<<c;
            break;
            }
        }
        return 0;
    }
    
  • Re: Programma mcm e mcd tra 3 numeri

    Anche se il tuo codice funziona devi sapere che hai usato un sistema Brute Force, per vedere quante iterazioni devono essere eseguite prima di raggiungere il risultato ho inserito la variabile ps che le conta:
    tuo codice:
    
    #include <iostream>
    #include <string>
    #include <cmath>
    using namespace std;
    int ps=0;
    
    int main(){
        int i,c=0; //i=contatore MCD c=contatore mcm
        int num1,num2,num3,min,max=0;
        cout<<"num1: ";
        cin>>num1;
        cout<<"num2: ";
        cin>>num2;
        cout<<"num3: ";
        cin>>num3;
        //calcolo MCD
        if (num1<num2){min=num1;ps+=1;}
    
        else {min= num2;}
    
        if (num3<min){min=num3;ps+=1;}
    
        for(i=min;i>=1;i--){
            ps+=1;
            if( num1%i==0 and num2%i==0 and num3%i==0){
            cout<<endl<<"MCD= "<<i<<endl;
            break;
            }
        }
    
        //calcolo mcm
        max=num1*num2*num3;
        ps+=1;
        for(c=1;c<=max;c++){
            ps+=1;
            if( c%num1==0 && c%num2==0 && c%num3==0){
            cout<<"mcm= "<<c<<endl;
            cout<<"iterazioni= "<<ps<<endl;
            break;
            }
        }
        return 0;
    }
    
    il mio codice con l'algoritmo di Euclide:
    
    #include <stdio.h>
    int MCD(int n1, int n2);
    int mcm(int n1, int n2);
    int ps; // passi
    
    int main()
    {
        int n1, n2, n3 = 0;
    
        printf("MCD e mcm tra tre numeri\n\n");
    riinput:
    
        ps=0;
        printf("Inserisci il primo numero: ");
        scanf("%d", &n1);
        printf("inserisci il secondo: ");
        scanf("%d", &n2);
        printf("inserisci il terzo: ");
        scanf("%d", &n3);
    
        printf("\nMCD %d\n", MCD(n1,MCD(n2,n3))); // richiesta nidificata
        printf("mcm %d\n" , mcm(n1,mcm(n2,n3))); // richiesta nidificata
        printf("iterazioni %d\n",ps); // cicli
        printf("\n-------------------------------\n");
        goto riinput;
    }
    
    int MCD(int n1, int n2)
    {
        while (n1!=n2) // finquando diventano uguali
        {
            if (n1<n2)
            {
                n2=n2-n1;
                ps+=1;
            }
            else
            {
                n1=n1-n2;
                ps+=1;
            }
        }
        return n1;
    }
    
    int mcm(int n1, int n2)
    {
        ps+=1;
        int valore = n1*n2/MCD(n1,n2);
        return valore;
    }
    
    Per esempio il MCD e il mcm tra 234, 762,1024, il tuo codice trova il risultato corretto MCD 2 e mcm 15215616, dopo 15215851 iterazioni
    Il mio codice dopo 1842 iterazioni
  • Re: Programma mcm e mcd tra 3 numeri

    Avevo provato anche io a correggere il codice come hai fatto tu, ma L’m.c.m non me lo riesce comunque a calcolare...
  • Re: Programma mcm e mcd tra 3 numeri

    Anonymous_User ha scritto:


    Avevo provato anche io a correggere il codice come hai fatto tu, ma L’m.c.m non me lo riesce comunque a calcolare...
    Hai copiato e incollato il codice corretto che ti ho postato?, quella del for non è l'unica correzione che ho fatto, ho anche invertito i num1%c su: if( num1%c==0 and num2%c==0 and num3%c==0) e ho sostituito "and" che si usa in basic, con && che si usa in C.
  • Re: Programma mcm e mcd tra 3 numeri

    Si, scusami. L’avevo visto velocemente e non mi ero accorto delle altre modifiche. Si effettivamente ora con quelle modifiche all’if funziona, riesce a calcolarmelo correttamente l’mcm. Ti ringrazio. Potresti spiegarmi come mai hai diviso il contatore per il numero e non viceversa ?
  • Re: Programma mcm e mcd tra 3 numeri

    Prendi il frammento di codice che trova mcm ed analizziamolo insieme:
    
       //calcolo mcm
        max=num1*num2*num3;
        ps+=1;
        for(c=1;c<=max;c++){
            ps+=1;
            if( c%num1==0 && c%num2==0 && c%num3==0){
            cout<<"mcm= "<<c<<endl;
            cout<<"iterazioni= "<<ps<<endl;
            break;
            }
        }
    
    la prima istruzione: max=num1*num2*num3; ci da il massimo delle iterazioni, max sarà sicuramente divisibile dai tre numeri dati.
    Il minimo comune multiplo è un numero che è divisibile senza resto da tutti i numeri dati.
    nel for impostiamo un ciclo che va da 1 a max incrementando la variabile c (il numero che deve essere verificato se è divisibile senza resto dagli altri numeri)
    facciamo l'esempio che num1=10, num2=20, num3=30
    All'inizio c=1, se fai come hai fatto tu num1%c, sarebbe 10/1, che da resto zero, cioè è divisibile, mentre 1 non è il mcm.
    Continuiamo l'esempio ma con l'istruzione corretta:
    c%num1 1/10 = 0.1
    c%num2 1/20 = 0.05
    c%num3 1/30 = 0.033
    le condizioni sono false, tutte le divisioni sono con resto, 1 non è il mcm
    il for continua e incrementa c di una unità:
    c%num1 2/10 = 0.2
    c%num2 2/20 = 0.1
    c%num3 2/30 = 0.066
    le condizioni sono false, 2 non è il mcm

    Quando le condizioni saranno tutte vere?, quando c diventa 60,
    c%num1 60/10 = 6.0
    c%num2 60/20 = 3.0
    c%num3 60/30 = 2.0
    tutte le divisoni danno resto zero 60 è il mcm

    Il programma non esegue nessuna ottimizzazione, controlla ostinatamente tutti i valori di c finquando non trova il mcm, utilizzando la forza bruta, invece dell'intelligenza.
  • Re: Programma mcm e mcd tra 3 numeri

    Capito, sei stato chiarissimo. Ti ringrazio !
  • Re: Programma mcm e mcd tra 3 numeri

    Un ultima cosa...dato che il professore ha chiesto di realizzare il programma con le funzioni, le ho inserite sia per l'mcd, sia per l'mcm.
    ma il programma continua a darmi questo errore
    6 24 D:\mcmm.cpp [Error] expression list treated as compound expression in initializer [-fpermissive]
    6 25 D:\mcmm.cpp [Error] expected ',' or ';' before '{' token
    il primo errore non capisco a cosa sia dovuto e il secondo non credo manchi , o ;
    vi scrivo il codice cosi potete aiutarmi [CODE] #include <iostream> #include <string> #include <cmath> using namespace std; int num1,num2,num3; int MCD(num1,num2,num3){ int i; int num1,num2,num3,min,max; if (num1<num2){min=num1;} else {min= num2;} if (num3<min){min=num3;} for(i=min;i>=1;i--){ if( num1%i==0 and num2%i==0 and num3%i==0){ break; } } return i; } int mcm(num1,num2,num3,){ int c; c=0; max=num1*num2*num3; for(c=1;c<=max;c++){ if( c%num1==0 & c%num2==0 & c%num3==0){ break; } } return c; } int main(){ int x,y,z; cout<<"num1: "; cin>>x; cout<<"num2: "; cin>>y; cout<<"num3: "; cin>>z; //stampa MCM e mcm cout<<"M.C.D= "<<MCM(x,y,z); cout<<mcm(x,y,z); return 0;}
Devi accedere o registrarti per scrivere nel forum
16 risposte