Oppure

Loading
20/11/09 21:48
zaire90
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:

/*  QUESTO PROGRAMMA ACQUISISCE DUE INTERI POSITIVI n E m E NE CALCOLA IL LORO
    MINIMO COMUNE MULTIPLO                                                    */
    
# include <stdlib.h>
# include <stdio.h>
# include <math.h>

void leggi_n(int&);            // Per trovare il mcm sfruttiamo il fatto che:
void leggi_m(int&);            // mcm(n,m) = (n * m) / MCD(n,m)             
int MCD(int,int);              // quindi dobbiamo in realtà fare la funzione che 
                               // calcoli il MCD di n e m
int main (void)                 
{
    int n, m, mcm, mcd;
    
    leggi_n(n);
    leggi_m(m);
    mcd=MCD(n,m);
    
    mcm=(n*m)/(mcd);
    
    printf("\n\nmcm(%d,%d) = %d",n, m, mcm);
    printf("\n\n\n\n");
    system("PAUSE");
    return 0;
}

void leggi_n(int& n)
{
    printf("Scrivi il primo numero intero:             n = ");
    scanf("%d",&n);
    
       while (n<0)
             {
               printf("\n\nn deve essere un intero positivo!");
               printf("Scrivi il primo numero intero:             n = ");
               scanf("%d",&n);
             }
    return;
}
    
void leggi_m(int& m)
{
    printf("Scrivi il secondo numero intero:             m = ");
    scanf("%d",&m);
    
        while (m<0)
             {
               printf("\n\nm deve essere un intero positivo!");
               printf("Scrivi il secondo numero intero:             m = ");
               scanf("%d",&m);
             }
    return;
}

int MCD(int n, int m)
{
    int c;
    if(n<m)
      {
         c=n; n=m; m=c;
      }
    
    while (m>0)
    { 
       int r=n%m;
       n=m;
       m=r;
    }
    
    int mcd;
    n=mcd;
    
    return mcd;
}


sicuramente sbaglio qualcosa nell'ultima funzione poichè non sono affatto pratico nel loro uso...ogni consiglio è ben accetto.Grazie
Ultima modifica effettuata da zaire90 20/11/09 21:51
aaa
22/11/09 6:27
pierotofy
Postato originariamente da zaire90:
int MCD(int n, int m)
{
    int c;
    if(n<m)
      {
         c=n; n=m; m=c;
      }
    
    while (m>0)
    { 
       int r=n%m;
       n=m;
       m=r;
    }
    
    int mcd;
    n=mcd;
    
    return mcd;
}


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.

int greatestCommonDivisor(int a, int b){
  int c = a % b;
  while(c != 0)
  {
    a = b;
    b = c;
    c = a % b;
  }
  return b;
}
Il mio blog: piero.dev
22/11/09 14:18
gigisoft
Postato originariamente da pierotofy:

Postato originariamente da zaire90:
int MCD(int n, int m)
{
    int c;
    if(n<m)
      {
         c=n; n=m; m=c;
      }
    
    while (m>0)
    { 
       int r=n%m;
       n=m;
       m=r;
    }
    
    int mcd;
    n=mcd;
    
    return mcd;
}


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.

int greatestCommonDivisor(int a, int b){
  int c = a % b;
  while(c != 0)
  {
    a = b;
    b = c;
    c = a % b;
  }
  return b;
}


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
aaa
22/11/09 16:27
zaire90
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...


int main (void)                 
{
    ... 
    h=MCD(n,m);
    
    mcm=(n*m)/(h);
    ...
}

int MCD(int n, int m)
{
    int c;
    if(n<m)
      {
         c=n; n=m; m=c;
      }
    
    while (m != 0)
    { 
       int r=n%m;
       n=m;
       m=r;
    }
    
    return n;
}

E' giusto adesso vero?
grazie Luigi per la dritta:)
Ultima modifica effettuata da zaire90 22/11/09 16:31
aaa