Calcolo del Massimo Comun Divisore

Slides:



Advertisements
Presentazioni simili
Fondamenti di Informatica
Advertisements

INFORMATICA Altre Istruzioni di I/O
Gli Algoritmi di ordinamento
INFORMATICA Algoritmi fondamentali
INFORMATICA Strutture condizionali
Corso di Laurea Triennale in Ingegneria Gestionale Corso di Fondamenti di informatica A. A A.Pinto Algoritmi di ricerca 1.
Process synchronization
Uso avanzato di C.
Nel C non esiste un dato primario di tipo stringa; queste sono rappresentate con un array monodimensionale di caratteri (tipo char). Così per definire.
Calcolo del minimo comune multiplo (m.c.m.) Luigi Sante
Ricorsione Procedure e funzioni ricorsive. Definizioni Un oggetto si dice ricorsivo se è definito totalmente o parzialmente in termini di sé stesso La.
Iterazione A. Ferrari.
Procedure e funzioni ricorsive
Sviluppo di programmi strutturati
Esempio 1: Calcolo del M.C.D.
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
ESERCITAZIONE N. 5 ESERCIZIO N. 1 Autore: Biagio Brattoli S I Corso.
INFORMATICA Strutture iterative
Iterazione enumerativa (for)
PROGRAMMI DI RICERCA E ORDINAMENTO
Algoritmi Politecnico di Milano C Primi programmi Politecnico di Milano.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 20 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
Algebra di Boole ed elementi di logica
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA
CORSO DI PROGRAMMAZIONE II
APPUNTI SUL LINGUAGGIO C
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente) ITERAZIONE: ripetere piu volte una sequenza di operazioni istruzioni: for, while, do.
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
ITERAZIONE e RICORSIONE (eseguire uno stesso calcolo ripetutamente)
Algoritmi su Tipi Semplici
Strutture di controllo nel C
Strutture di controllo in C -- Flow Chart --
Esercizi C sui tipi definiti dall’utente
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
Esercizi C su array e matrici
Le funzioni.
Le operazioni aritmetiche con i numeri naturali e decimali
Le operazioni con i numeri
Radix-Sort(A,d) // A[i] = cd...c2c1
Programmazione di Calcolatori
Massimo Comun Divisore
Radice quadrata di un numero
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Come affrontare un problema… Marco D. Santambrogio – Ver. aggiornata al 18 Ottobre.
14 marzo 2002 Avvisi:.
Esercizi su File.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
Corso di Programmazione in Java – Esercizio n° 001
Anno accademico Le istruzioni di controllo in C.
Definizione di un algoritmo
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 1 Cicli ed asserzioni Corso di Informatica 2 a.a. 2003/04 Lezione 1.
Algoritmo per la generazione dei primi 20 numeri dispari Autore: Francesco Russo matr
Ripetizione La vera potenza dei programmi per computer risiede nella capacità di ripetere lo stesso calcolo o sequenza di istruzioni più volte, ogni volta.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Come affrontare un problema… Marco D. Santambrogio – Ver. aggiornata al 21 Agosto.
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
Calcolo letterale.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 26 Marzo 2014.
Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (II) Istruzioni e strutture di controllo.
Allievi Elettrici - AA Le funzioni ricorsive in C
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
C++:Strutture di Controllo
MASSIMO COMUNE DENOMINATORE (M.C.D)
L’unità frazionaria ESEMPIO Rappresentazione
DEFINIZIONE. I multipli di un numero sono costituiti dall’insieme dei prodotti ottenuti moltiplicando quel numero per la successione dei numeri naturali.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 22 Marzo 2016.
Transcript della presentazione:

Calcolo del Massimo Comun Divisore di Russo Matteo Matricola: 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 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;

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!

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 …

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.

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

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