Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - codice del mcm di due numeri
Forum - C/C++ - codice del mcm di due numeri

Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 22:48
Venerdì, 20/11/2009
Salve
in questo codice in cui devo calcolare il minimo comune multiplo di due numeri interi
sbaglio sicuramente qulcosa nella funzione del MCD, perchè appena eseguo il programma e inserisco i due numeri compare la finestra degli errori di windows e si chiude tutto.
Ecco il codice che ho scritto:

Codice sorgente - presumibilmente C/C++

  1. /*  QUESTO PROGRAMMA ACQUISISCE DUE INTERI POSITIVI n E m E NE CALCOLA IL LORO
  2.     MINIMO COMUNE MULTIPLO                                                    */
  3.    
  4. # include <stdlib.h>
  5. # include <stdio.h>
  6. # include <math.h>
  7.  
  8. void leggi_n(int&);            // Per trovare il mcm sfruttiamo il fatto che:
  9. void leggi_m(int&);            // mcm(n,m) = (n * m) / MCD(n,m)            
  10. int MCD(int,int);              // quindi dobbiamo in realtà fare la funzione che
  11.                                // calcoli il MCD di n e m
  12. int main (void)                
  13. {
  14.     int n, m, mcm, mcd;
  15.    
  16.     leggi_n(n);
  17.     leggi_m(m);
  18.     mcd=MCD(n,m);
  19.    
  20.     mcm=(n*m)/(mcd);
  21.    
  22.     printf("\n\nmcm(%d,%d) = %d",n, m, mcm);
  23.     printf("\n\n\n\n");
  24.     system("PAUSE");
  25.     return 0;
  26. }
  27.  
  28. void leggi_n(int& n)
  29. {
  30.     printf("Scrivi il primo numero intero:             n = ");
  31.     scanf("%d",&n);
  32.    
  33.        while (n<0)
  34.              {
  35.                printf("\n\nn deve essere un intero positivo!");
  36.                printf("Scrivi il primo numero intero:             n = ");
  37.                scanf("%d",&n);
  38.              }
  39.     return;
  40. }
  41.    
  42. void leggi_m(int& m)
  43. {
  44.     printf("Scrivi il secondo numero intero:             m = ");
  45.     scanf("%d",&m);
  46.    
  47.         while (m<0)
  48.              {
  49.                printf("\n\nm deve essere un intero positivo!");
  50.                printf("Scrivi il secondo numero intero:             m = ");
  51.                scanf("%d",&m);
  52.              }
  53.     return;
  54. }
  55.  
  56. int MCD(int n, int m)
  57. {
  58.     int c;
  59.     if(n<m)
  60.       {
  61.          c=n; n=m; m=c;
  62.       }
  63.    
  64.     while (m>0)
  65.     {
  66.        int r=n%m;
  67.        n=m;
  68.        m=r;
  69.     }
  70.    
  71.     int mcd;
  72.     n=mcd;
  73.    
  74.     return mcd;
  75. }



sicuramente sbaglio qualcosa nell'ultima funzione poichè non sono affatto pratico nel loro uso...ogni consiglio è ben accetto.Grazie

Ultima modifica effettuata da zaire90 il 20/11/2009 alle 22:51
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 7:27
Domenica, 22/11/2009
Testo quotato

Postato originariamente da zaire90:
Codice sorgente - presumibilmente C++

  1. int MCD(int n, int m)
  2. {
  3.     int c;
  4.     if(n<m)
  5.       {
  6.          c=n; n=m; m=c;
  7.       }
  8.    
  9.     while (m>0)
  10.     {
  11.        int r=n%m;
  12.        n=m;
  13.        m=r;
  14.     }
  15.    
  16.     int mcd;
  17.     n=mcd;
  18.    
  19.     return mcd;
  20. }




Non so dove hai preso quest'algoritmo, ma a parte alcune cose strane come int mcd; n = mcd; return mcd; perchè imposti n a mcd al termine della funzione? Gli argomenti sono passati by-value, non by-reference.


Io ho usato questa per uno dei miei progetti.

Codice sorgente - presumibilmente C++

  1. int greatestCommonDivisor(int a, int b){
  2.   int c = a % b;
  3.   while(c != 0)
  4.   {
  5.     a = b;
  6.     b = c;
  7.     c = a % b;
  8.   }
  9.   return b;
  10. }



Il mio blog: https://piero.dev
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 15:18
Domenica, 22/11/2009
Testo quotato

Postato originariamente da pierotofy:

Testo quotato

Postato originariamente da zaire90:
Codice sorgente - presumibilmente C++

  1. int MCD(int n, int m)
  2. {
  3.     int c;
  4.     if(n<m)
  5.       {
  6.          c=n; n=m; m=c;
  7.       }
  8.    
  9.     while (m>0)
  10.     {
  11.        int r=n%m;
  12.        n=m;
  13.        m=r;
  14.     }
  15.    
  16.     int mcd;
  17.     n=mcd;
  18.    
  19.     return mcd;
  20. }




Non so dove hai preso quest'algoritmo, ma a parte alcune cose strane come int mcd; n = mcd; return mcd; perchè imposti n a mcd al termine della funzione? Gli argomenti sono passati by-value, non by-reference.


Io ho usato questa per uno dei miei progetti.

Codice sorgente - presumibilmente C++

  1. int greatestCommonDivisor(int a, int b){
  2.   int c = a % b;
  3.   while(c != 0)
  4.   {
  5.     a = b;
  6.     b = c;
  7.     c = a % b;
  8.   }
  9.   return b;
  10. }




esatto, anch'io in passato ho usato lo stesso algoritmo postato da Piero, l'unica accortezza e' assicurarsi che all'inizio della funzione greatestCommonDivisor
a sia maggiore o uguale a b

inoltre si puo' risparmiare un'iterazione inserendo nel while la condizione

a != b

o addirittura

a < b

ciao. :k:

Luigi

PM Quote
Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 17:27
Domenica, 22/11/2009
Beh, non è che l'abbia trovato, l'ha fatto la mia professoressa a lezione. In ogni caso è più o meno uguale a quello che hai scritto tu no?

Comunque ho capito cosa volevi dirmi riguardo al passaggio per valore...in effetti non so perchè avevo fatto quella cosa di chiamare n=mcd, pee non far uscire n!...BOH! Adesso ho cambiato la funzione in quest'altro modo e mi funziona...

Codice sorgente - presumibilmente C++

  1. int main (void)                
  2. {
  3.     ...
  4.     h=MCD(n,m);
  5.    
  6.     mcm=(n*m)/(h);
  7.     ...
  8. }
  9.  
  10. int MCD(int n, int m)
  11. {
  12.     int c;
  13.     if(n<m)
  14.       {
  15.          c=n; n=m; m=c;
  16.       }
  17.    
  18.     while (m != 0)
  19.     {
  20.        int r=n%m;
  21.        n=m;
  22.        m=r;
  23.     }
  24.    
  25.     return n;
  26. }


E' giusto adesso vero?
grazie Luigi per la dritta:)

Ultima modifica effettuata da zaire90 il 22/11/2009 alle 17:31
PM Quote