Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
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++
/* 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 il 20/11/2009 alle 22:51
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.
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++
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
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++
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 il 22/11/2009 alle 17:31