Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 196493 a.a. 2012/2013
Problema Calcolare il massimo comun divisore di due numeri.
Studio del problema nel suo dominio specifico Il massimo comune divisore (M.C.D.) di due numeri interi a e b che non siano entrambi uguali a zero, è il numero naturale più grande per il quale possono entrambi essere divisi.
Algoritmo Leggi entrambi i valori Controlla se sono diversi da 0, se almeno uno lo è richiedi all’utente di reinserirli Calcolo il valore assoluto di entrambi i numeri Trova il minimo fra i due, inizializza i con 2 Dividi entrambi i numeri per il numero i Se entrambi i numeri sono divisibili per questo numero: mcd i Incrementa i Ripeti l’operazione finché i sia uguale al minimo fra i due numeri
Codice Sorgente #include <stdio.h> #include <stdlib.h> int main() { int i,n1,n2,MIN,mcd; do{ printf("Inserire due numeri (interi): "); scanf("%d %d",&n1,&n2); } while(n1==0 || n2==0); n1=abs(n1); n2=abs(n2);
Codice Sorgente if(n1>n2){ MIN=n2; } else{ MIN=n1; mcd=1; for(i=1;i<=MIN;i++){ if((n1%i)==0 && (n2%i)==0){ mcd=i; printf("MCD: %d",mcd); return 0;
Osservazione Il problema così risolto va bene per numeri relativamente piccoli. Esempio: se noi inseriamo 30 e 27, l’operazione all’interno del secondo ciclo (FOR) si ripeterà per 27 volte! Esiste un secondo algoritmo che permette di calcolare il MCD in modo più veloce: sfruttando il «metodo delle sottrazioni successive» di Euclide.
Studio del problema nel suo dominio specifico (2) “Considerati due numeri a e b, sostituiamo il maggiore tra essi con la loro differenza, procediamo fino a quando uno dei nuovi numeri della coppia è nullo, si osserva che il Massimo Comun Divisore è il primo numero, ottenuto mediante tali differenze e che sia diverso da zero” (Libro VII degli Elementi di Euclide).
Studio del problema nel suo dominio specifico (2) f(x,x) = x f(x,y) = f(x - y, y) se x > y f(x,y) = f(x, y – x) se y > x
Giustificazione Se A e B hanno M come MCD, allora si può porre ( si supponga A > B): A = h · M B = k · M La differenza A- B = (h – k) · M ha ancora M come fattore. Si osserva che A – B < A, per cui se si ripete il procedimento tra B e la differenza, e così via, si arriva a determinare M.
Algoritmo Leggi entrambi i valori Controlla se sono diversi da 0, se almeno uno lo è richiedi all’utente di reinserirli Calcolo il valore assoluto di entrambi i numeri Sostituire il numero più grande tra i due con la differenza tra i due Ripetere l’operazione fino a quando i due numeri hanno lo stesso valore
Osservazione Bisogna sempre sostituire il numero più grande con la differenza fra i due, pertanto se la differenza dovesse essere minore del secondo numero, quest’ultimi bisogna scambiarli!
Esempio Prendiamo in considerazione 100 e 90 Per cui bisogna scambiarli: Il MCD è 10. a b 100 90 10 ERRORE! / a b 90 10 80 …
Codice Sorgente #include <stdio.h> #include <stdlib.h> int main() { int i,n1,n2; do{ printf("Inserire due numeri (interi): "); scanf("%d %d",&n1,&n2); } while(n1==0 || n2==0); n1=abs(n1); n2=abs(n2);
Codice Sorgente while(n1!=n2){ if(n1>n2){ n1=n1-n2; } else{ n2=n2-n1; } printf("MCD: %d",n1); return 0;
Osservazione Esiste però, un altro metodo che permette di trovare il risultato ancora più velocemente: il «metodo delle divisioni successive».
Studio del problema nel suo dominio specifico (3) “Il massimo comun divisore di due numeri è uguale al massimo comun divisore tra il minore di essi e il resto della loro divisione” (Euclide). Consideriamo due numeri a e b, sostituiamo il minore di essi con il resto della divisione tra il numero maggiore e quello minore, il procedimento termina quando il resto è uguale a 0 e il MCD è il valore assunto dal valore minore.
Giustificazione Siano dati A e B e si supponga A > B. Sia M = MCD(A, B), allora A = h · M B = k · M Se effettuo la divisione: A / B = q con resto r, quindi: A = q · B + r con r < B (< A). Da cui: A - q · B = r sostituendo: h · M - q · k · M = r (h - q · k) · M = r da cui si deduce che anche r ha come fattore M. Iterando l’operazione tra B ed r, e così via, si arriva al resto = 0, momento in cui si arriva a determinare M.
Prendiamo in considerazione 182 e 104: Il MCD è 26. Esempio Prendiamo in considerazione 182 e 104: Il MCD è 26. a b Resto 182 104 78 26
Algoritmo Leggi entrambi i valori Controlla se sono diversi da 0, se almeno uno lo è richiedi all’utente di reinserirli Calcolo il valore assoluto di entrambi i numeri Controllare che il primo sia maggiore del secondo, in caso scambiarli Calcolare il resto della divisione tra i due
Algoritmo Sostituire il valore maggiore con il minore Sostituire il valore minore con il resto (solo se il resto è maggiore di 0 Ripetere l’operazione fino a quando il resto è maggiore di 0
Codice Sorgente #include <stdio.h> #include <stdlib.h> int main() { int i,n1,n2; do{ printf("Inserire due numeri (interi): "); scanf("%d %d",&n1,&n2); } while(n1==0 || n2==0);
Codice Sorgente n1=abs(n1); n2=abs(n2); while(n1!=n2){ if(n1>n2){ n1=n1-n2; } else{ n2=n2-n1; } printf("MCD: %d",n1); return 0;