La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Calcolo del Massimo Comun Divisore

Presentazioni simili


Presentazione sul tema: "Calcolo del Massimo Comun Divisore"— Transcript della presentazione:

1 Calcolo del Massimo Comun Divisore
di Russo Matteo Matricola: a.a. 2012/2013

2 Problema Calcolare il massimo comun divisore di due numeri.

3 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.

4 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

5

6

7 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);

8 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;

9 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.

10 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).

11 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

12 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.

13 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

14 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!

15 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

16

17 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);

18 Codice Sorgente while(n1!=n2){ if(n1>n2){ n1=n1-n2; } else{ n2=n2-n1; } printf("MCD: %d",n1); return 0;

19 Osservazione Esiste però, un altro metodo che permette di trovare il risultato ancora più velocemente: il «metodo delle divisioni successive».

20 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.

21 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.

22 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

23 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

24 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

25

26

27 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);

28 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;


Scaricare ppt "Calcolo del Massimo Comun Divisore"

Presentazioni simili


Annunci Google