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

Preview:

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

Recommended