mcm mcd

« Older   Newer »
 
  Share  
.
  1.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    questo post è più che altro per confronto..a tutti voi(soprattutto root, visto che qui sei ,a quanto ho potuto constatare personalmente, quello che più mi sta aiutando)

    ho scritto sulla base di una traccia d'esame questo programma,e parte..volevo sapere se posso farlo in qualc'altro modo o non so...
    scrivere un programma che usando le funzioni mcd(int n, int m) e mcm(int n, int m) restituisca il massimo comun divisore ed il minimo comune multiplo di 2 numeri inseriti da tastiera

    il programma è:

    #include<iostream>
    #include<cstdlib.h>


    using namespace std;

    int mcd(int n,int m) {
    int resto,mcd;

    do {
    if(n>m){

    mcd=resto;
    resto=n%­m;
    n=resto;}
    else{
    mcd=resto;
    resto=m%­n;
    m=resto;}
    }
    while(resto!=0)
    return mcd;
    }

    int mcm(int n,int m) {

    return(n*m)/(mcd(n,m));
    }



    int main()
    {
    int uno,due;
    cout << "Inserire il primo numero: ";
    cin >> uno;
    cout << "Inserire il secondo numero: ";
    cin >> due;

    cout<<"mcm = "<<mcm(uno,due)<<endl;
    cout<<"mcd = "<<mcd(uno,due)<<endl;

    return 0;
    }
     
    Top
    .
  2.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Certo, un primo modo è fare il controllo sui numeri n ed m al di fuori del while (se m è maggiore scambi i valori). Per non dilungarmi e correre il rischio di essere noioso dico solo che un "if" per il processore comporta un notevole spreco, anche se il tutto ormai è ridotto grazie ad alcuni meccanismi sia in fase di compilazione quanto in fase di esecuzione.

    Un modo molto comune per scrivere la funzione MCD, è sfruttare la ricorsione. Fai il tutto in 4-5 righe.
     
    Top
    .
  3.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    è qual'è questa funzione ricorsiva che dici?questo programma l ho fatto io da solo (cercando anche in giro sul web)
    esiste un modo meno lungo di quello scelto da me?non trovo difficile questo programma(dopo averlo capito,all inizio andai nel pallone) ma se esiste un altro modo più sbrigativo diciamo,quale può essere?
    di solito il tempo che il prof da alle esame è una mezz'oretta poi non vuol sapere più niente(al max da altri 10 minuti se è in giornata SI)...se compila bene,altrimenti non vuol sapere niente e te ne manda...dopo di chè dopo un oretta,oretta e mezza chiama tutti quelli passati e fa l orale,una mezz'oretta a persona..di norma se ne va tutto il giorno per st'esame del cavolo..
     
    Top
    .
  4.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    Stavo per scriverti 3 ore fa, ma ho avuto improvvisi problemi di linea.

    La più rapida è una funzione ricorsiva:
    CODICE
    int mcd(int a, int b) {
     if(b == 0) return a;
     return mcd(b, a%b);
    }


    Sono proprio 3 righe come vedi. Se hai domande chiedi pure.
     
    Top
    .
  5.  
    .
    Avatar

    Member

    Group
    Member
    Posts
    206

    Status
    Offline
    grazie root il modo che dici tu è davvero semplice...ho letto solo ora perchè ho avuto problemi con la linea,è saltata una centralina fuori da me e solo ora l hanno aggiustata..comunque grazie
     
    Top
    .
  6.  
    .
    Avatar

    Senior Member

    Group
    Staff
    Posts
    10,796

    Status
    Anonymous
    La ricorsione può essere utile in alcuni casi, con algoritmi molto complessi da scrivere iterativamente. Comunque nella gran maggioranza dei casi è meglio evitarla in quanto una soluzione iterativa offre prestazioni migliori.
    Inoltre se ti accorgi che un problema è risolvibile in modo ricorsivo, pensa prima di tutto alla condizione di terminazione (nel caso li sopra b==0), assumendo di conoscere già i passaggi intermedi, altrimenti se ti dimentichi quella parte non terminerà mai.
     
    Top
    .
5 replies since 4/11/2013, 11:54   127 views
  Share  
.