Upload
ferdinanda-massa
View
219
Download
2
Embed Size (px)
Citation preview
Calcolo del Massimo Comun Divisore
di Russo MatteoMatricola: 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 Sorgenteif(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!
EsempioPrendiamo in considerazione 100 e 90
Per cui bisogna scambiarli:
Il MCD è 10.
a b
100 90
10 90
ERRORE! /
a b
90 10
80 10
… …
10 10
0 10
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.
Esempio
Prendiamo in considerazione 182 e 104:
Il MCD è 26.
a b Resto
182 104 78
104 78 26
78 26 0
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 Sorgenten1=abs(n1);n2=abs(n2);
while(n1!=n2){ if(n1>n2){ n1=n1-n2; } else{ n2=n2-n1; } }
printf("MCD: %d",n1); return 0;}