Algoritmo per il calcolo del M.C.D (massimo comune divisore)

L’esercizio che si propone è il calcolo del massimo comune divisore di due numeri interi positivi a e b.
Il calcolo del M.C.D. avviene con la scomposizione dei numeri a e b in fattori primi, e il massimo comune divisore è il prodotto di tutti i fattori comuni presi con il minimo esponente.
Se i due numeri a e b sono primi inoltre il M.C.D. è pari a 1.
Alcuni esempi
a=10 e b=30 a=5*2 e 30=5*2*3 il M.C.D è quindi 5*2=10;
altro esempio:
a=96 e b=12 la scomposizione in fattori a=2*2*2*2*2*2*3 e b=2*2*3 e quindi iil M.C.D. = 2*2*3 in quanto i fattori comuni sono 2 e 3 e la potenza minima di 2 è 22.
Per individuare il M.C.D: l’algoritmo deve eseguire le divisioni di a e b per tutti i numeri interi compresi nell’intervallo [2,min(a,b)] ovvero tutti i numeri che sono compresi fino al valore minore fra a e b. Nel caso di a=96 e b=12 il numero più piccolo min(12,96) =12 e quindi i valori da utilizzare nel mio ciclo sono c=2…12. Il risultato r del M.C.D. sarà poi memorizzato in una variabile r che contiene il valore di c quando entrambi i numeri a e b sono divisibili per il valore c. Per verificare che a e b sono divisibili per c si utilizza l’operatore resto (modulo o %) della divisione intera fr adue numeri a e c e b e c contemporaneamente.
La tabella dati e:

UsoNomeTipoDescrizione
inputa,binteronumeri in ingresso al problema positivi
lavorocinterocontatore del ciclo per selezionare i fattori
outputrinteroM.C.D. risultato

E’ utile notare che l’algoritmo deve controllare se i due numeri in input sono positivi e solo in caso affermativo si procede all’elaborazione del calcolo M.C.D.; il calcolo può essere fatto anche con numeri negativi la generalizzazione è molto semplice una volta compreso il procedimento.
L’algoritmo risolutivo è:

Algoritmo per il calcolo del M.C.D.
è rappresentato il flow chart

Lo pseudo – codice è:
Inizio
c←1
r←1
fai
inizio
scrivi “inserisci due numeri a e b di cui vuoi calcolare l’M.C.D.”
leggi a,b
fine
mentre ((a<=0) o (b<=0))
mentre ((c<=a) e (d<=c))
inizio
se ((a mod c=0) e (b mod c=0))
r←c
c←c+1
fine
scrivi “L’M.C.D. è:”, r
fine

L’algoritmo utilizza un ciclo pre – condizionale per calcolare il massimo comune divisore che è appunto il massimo numero che divide contemporaneamente si a che b. Per fare questo la variabile contatore c è una variabile di test in quanto partendo da 1 prova dividere a e b per c. Se entrambe le divisioni sono senza resto c è il massimo comune divisore provvisorio. Il ciclo continua fin qaundo c non uguale appunto al minio di a e b.
Il codice C++ è:

#include <iostream>
using namespace std;
int main()
{
	int a,b,c,r;
	c=1;
	r=1;
	do
	{
		cout << "\n Inserisici i numeri a e b di cui vuoi calcolare il M.C.D.";
		cin >> a >> b;
	}
	while ((a<=0)||(b<=0));
	while ((c<=a)&&(c<=b)){
		if ((a % c==0)&&(b % c ==0))
			r=c;
		c++;
	}
	cout << "\n Il massimo comune divisore è:"<< r << endl;
	return 0;
}

Link sponsorizzato

Video sulle strutture cicliche in C++