Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante 183948
minimo comune multiplo Scrivere un programma che calcoli il minimo comune multiplo di due numeri, con l'ausilio di una funzione che generi un vettore dei primi N numeri primi.
Passaggi fondamentali Calcolare i numeri primi e inserirli in un vettore Confrontare i due numeri dati con i numeri primi e calcolarne il minimo comune multiplo
Vettore dei numeri primi Un numero è primo se è divisibile solo per se stesso e per uno. I numeri primi di conseguenza possono essere ricavati escludendo i multipli. Per esempio: sapendo che 2 è primo , tutti i numeri multipli ovvero pari non sono primi. 3 non è multiplo di 2 quindi è primo , mentre il seguente 4 non lo è... In pratica, un numero è primo se non è divisibile per i numeri primi che lo precedono.
Vettore dei numeri primi (2) Bisogna confrontare il numero per tutti i numeri primi calcolati in precedenza e verificare che non sia divisibile (ovvero multiplo) 2 3 5 7 11 13 numero i i_riemp Numero_primo
Vettore dei numeri primi (3) primo=VERO; while(i < i_riemp && primo) { if((numero % numero_primo[i]) == 0) primo=FALSO; else i++; } Alla fine del ciclo, il flag primo dice se si è trovato un numero primo.
Vettore dei numeri primi (4) Se il numero è primo, lo si inserisce nel vettore nella prima posizione vuota (puntata da i_riemp) e si incrementa l'indice i_riemp (che indica anche il numero di numeri primi già trovati). Si incrementa il numero per una nuova ricerca. if(primo) { numero_primo[i_riemp]=numero; i_riemp++; } numero++;
Vettore dei numeri primi (5) L’intero blocco deve essere eseguito finché non si è raggiunto il numero di primi richiesto (test su i_riemp). Per le inizializzazioni, si sa già che 2 è il primo numero primo: lo si inserisce nel vettore e si comincia con numero = 3 (l’algoritmo sarebe comunque corretto anche partendo con il vettore vuoto (i_riemp = 0) e con numero = 2)
Vettore dei numeri primi (6) numero_primo[0]=2; i_riemp=1; numero=3; while(i_riemp < num_primi) { primo=VERO; i=0; while(i < i_riemp && primo) if(numero%numero_primo[i] == 0) primo = FALSO; else i++; } if(primo) numero_primo[i_riemp]=numero; i_riemp++; numero++;
Funzione calcola_primi Ora che abbiamo trovato come riempire il vettore dei numeri primi , passiamo a scrivere l’intestazione (e il prototipo) della funzione. void calcola_primi(int numero_primo[], int num_primi);
m.c.m. Il mcm è il prodotto di tutti i fattori primi comuni e non comuni, presi una sola volta con il massimo esponente.
m.c.m. (2) Il mcm è quindi risultato di un prodotto sequenziale tra numeri primi mcm=1; mcm = mcm * vettore_primi[indice_vettore];
m.c.m. (3) Per prendere il massimo esponente del numero primo considerato bisogna ripetere finché è fattore di almeno uno dei due numeri mcm=1; while(a%vettore_primi[indice_vettore]==0 || b%vettore_primi[indice_vettore]==0) { mcm = mcm * vettore_primi[indice_vettore]; }
m.c.m. (4) Ad ogni passaggio si divide il numero che ha soddisfatto la condizione per il numero primo preso in considerazione mcm=1; while(a%vettore_primi[indice_vettore]==0 || b%vettore_primi[indice_vettore]==0) { mcm = mcm * vettore_primi[indice_vettore]; if(a%vettore_primi[indice_vettore]==0) a=a/vettore_primi[indice_vettore]; if(b%vettore_primi[indice_vettore]==0) b=b/vettore_primi[indice_vettore]; }
m.c.m. (5) Quando la condizione non si verifica più, si esce dal ciclo e si passa al numero primo successivo, incrementando l'indice del vettore primo di 1. Quindi bisogna anche inizializzare prima l'indice a 0 indice_vettore=0; mcm=1; while(a%vettore_primi[indice_vettore]==0 || b%vettore_primi[indice_vettore]==0) { mcm = mcm * vettore_primi[indice_vettore]; if(a%vettore_primi[indice_vettore]==0) a=a/vettore_primi[indice_vettore]; if(b%vettore_primi[indice_vettore]==0) b=b/vettore_primi[indice_vettore]; } indice_vettore++;
m.c.m. (6) Tutto va ripetuto finché entrambi i numeri sono divisibili per i numeri primi e quindi diversi da 1 mcm=1; indice_vettore=0; while(a!=1 || b!=1) { while(a%vettore_primi[indice_vettore]==0 || b%vettore_primi[indice_vettore]==0) mcm = mcm * vettore_primi[indice_vettore]; if(a%vettore_primi[indice_vettore]==0) a=a/vettore_primi[indice_vettore]; if(b%vettore_primi[indice_vettore]==0) b=b/vettore_primi[indice_vettore]; } indice_vettore++;