Massimo Comun Divisore

Slides:



Advertisements
Presentazioni simili
Fondamenti di Informatica
Advertisements

Process synchronization
Uso avanzato di C.
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.
Linguaggio C++ Selezione.
Procedure e funzioni ricorsive
Sviluppo di programmi strutturati
Informatica Generale Marzia Buscemi
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Introduzione al linguaggio C
Esempio 1: Calcolo del M.C.D.
INFORMATICA Strutture iterative
Introduzione agli algoritmi. Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero.
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.
Algebra di Boole ed elementi di logica
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
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 1 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA
DAL PROBLEMA ALL'ALGORITMO Problemi e Programmi Paolo Amico
Esercizi su alberi binari
Gli algoritmi AA 2003/04 © Alberti Programmazione 2. Algoritmi.
INFORMATICA Esercizi.
Algoritmi su Tipi Semplici
Strutture di controllo nel C
Strutture di controllo in C -- Flow Chart --
Politecnico di Milano Esercizi Preparazione alla prima prova intermedia.
La Programmazione Ricorsiva
Calcolo del Massimo Comun Divisore
La divisione di un polinomio per un altro polinomio
Equazione di secondo grado.
Algoritmi e linguaggi di programmazione
Lezione 6 Strutture di controllo Il condizionale
void binario(int n); …………………
Radice quadrata di un numero
14 marzo 2002 Avvisi:.
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.
1Piero Scotto - C14. Finalità del corso Programma Materiale Requisiti Spendibilità 2Piero Scotto - C14.
Corso di Programmazione in Java – Esercizio n° 001
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Alberi binari Definizione della struttura dati: struct tree { };
La divisione di un polinomio
IO E LA MATEMATICA PROCEDURALE
Definizione di un algoritmo
ALGORITMI Un algoritmo è un insieme di istruzioni: -ordinate -non ambigue -effettivamente computabili.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 1 Cicli ed asserzioni Corso di Informatica 2 a.a. 2003/04 Lezione 1.
Array (ordinamento) CORDA – Informatica A. Ferrari.
La scomposizione col metodo di Ruffini
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Come affrontare un problema… Marco D. Santambrogio – Ver. aggiornata al 21 Agosto.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Costrutti iterativi Marco D. Santambrogio – Ver. aggiornata al 20 Ottobre 2014.
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.
Le frazioni.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
MASSIMO COMUNE DENOMINATORE (M.C.D)
Divisione tra un polinomio ed un binomio Regola di Ruffini
Un numero è primo se: è intero e maggiore di 1 è divisibile solo per se stesso e per 1 È un numero primo Infatti: 3 è intero; 3 > 1 3 è divisibile solo.
Criteri di divisibilità
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.
Numeri Primi, Numeri composti, MCD, mcm
Transcript della presentazione:

Massimo Comun Divisore (MCD) PROBLEMA: Dati due numeri A e B, trovare il numero più grande che divide entrambi. Algoritmo 1: Trovare tutti i divisori di A e tutti quelli di B e identificare quelli comuni. Ad es.: MCD(30,18) = 6, infatti 30 = 6 x 5 e 18 = 6 x 3 Algoritmo 2: Sfruttare la proprietà che se A > B MCD(A,B) = MCD(A – B,B) Ad es. MCD(30,18) = MCD(12,18) = MCD(12,6) = MCD(6,6) = 6

MCD PseudoCodice Input(A,B); Finché non (A = B) ripeti { se (A > B) allora A = A - B; altrimenti B = B - A; } Output(A);

Si scriva un programma che calcoli i numeri interi che sono divisori (con resto uguale a zero) di N. Dire inoltre se N è un numero primo. Suggerimenti. Un numero M è divisore di un numero N se il resto della divisione N=M è uguale a zero. Un numero è primo se è divisibile solo per 1 o per il numero stesso …int main(void) { int numero ; int divisore ; int primo ; printf("Inserisci un numero intero positivo: ") ; scanf("%d", &numero) ; if ( numero <= 0 ) printf("Errore: hai inserito un numero nullo o negativo\n") ; else divisore=1 ;primo = 1 ; while ( divisore <= numero ) { if ( numero%divisore == 0 ) printf("%d e’ divisore di %d\n", divisore, numero) ; if ( divisore != 1 && divisore != numero ) primo=0; } } /* STAMPA IL RISULTATO */ if ( primo == 1 ) printf("%d e’ un numero primo \n", numero) ;…… else printf("%d non e’ un numero primo \n", numero) ; exit(0) ;

Numeri di Fibonacci Scrivere un programma in linguaggio C che calcoli e stampi i primi N numeri della serie di Fibonacci, con N inserito da tastiera. La serie di Fibonacci inizia con 1, 1 ed ogni numero successivo è dato dalla somma dei due precedenti: 1, 1, 2, 3, 5, 8, 13, 21 . . . …. int main(void) { int N ; /* numero di termini della serie */ int nuovo_termine; /* nuovo termine della serie */ int prec_1, prec_2 ; /* due termini precedenti nella serie */ int num_termini; /* contatore per scandire i termini della serie */ printf("Inserisci il numero di termini della serie di Fibonacci: ") ; scanf("%d", &N) ; /* INIZIALIZZA A 1 I PRIMI DUE TERMINI DELLA SERIE */ prec_1 = 1 ; prec_2 = 1 ; /* INIZIALIZZA A 1 IL PRIMO VALORE DELLA SERIE */ nuovo_termine = 1 ; /* INIZIALIZZA A 0 IL CONTATORE CHE SCANDISCE I TERMINI DELLA SERIE */ num_termini = 0 ;

while ( num_termini < N ) { if ( num_termini >= 2 ) /* CALCOLA IL NUOVO TERMINE DELLA SERIE */ nuovo_termine = prec_1 + prec_2 ; /* AGGIORNA IL VALORE DEI DUE TERMINI PRECEDENTI NELLA SERIE */ prec_2 = prec_1 ; prec_1 = nuovo_termine ; } / * STAMPA UN NUOVO TERMINE DELLA SERIE */ printf("%d ", nuovo_termine) ; /* INCREMENTA IL CONTATORE "num_termini" */ num_termini = num_termini + 1 ; /* RIPORTA A CAPO IL CURSORE AL TERMINE DELLA STAMPA DELLA SERIE */ printf("\n"); exit(0) ;

introduzione alle Funzioni : Le funzioni accettano valori in ingresso e restituiscono un valore in uscita: y = f(x) ad esempio in matematica dando un valore alla f(x), appunto la x, otteniamo un valore y. In informatica le cose sono molto simili. Vediamo un esempio: Funzione Dati passati Dati restituiti

#include……… int Somma(int e, int f); // dichiarazione della funzione int main() //programma principale { int a, b, c; cout<<“Immetti un intero”<<endl; cin>>a; cout<<“ Immetti un'altro intero”<<endl; cin>>b; c=Somma(a, b); //richiamo alla funzione Somma cout<<“La somma è: “<<c<<endl; system (“pause”); return 0; } int Somma(int e, int f) //esplicitazione della funzione int z; z=e+f; return z;

La ricorsione Il linguaggio C (C++) consente l’uso di funzioni ricorsive. Una funzione ricorsiva è una funzione che richiama sé stessa (ricorsione diretta) o richiama una funzione che a sua volta la richiama (ricorsione indiretta). Affinché il procedimento abbia fine è necessario che siano verificate le due seguenti proprietà: Debbono esistere dei parametri (valori base) per cui la funzione non richiami sé stessa Ogni volta che la funzione richiama sé stessa i parametri devono essere più vicini ai valori base L’uso di tali funzioni è di utilità per la codifica di algoritmi che sono definiti ricorsivamente. Un esempio classico di algoritmo ricorsivo è quello che definisce il fattoriale di un numero. Il fattoriale del numero n intero positivo (cioè n!) è definito: uguale a n*(n-1)! se n !=0 uguale a 1 se n = 0 In altri termini è vera la seguente uguaglianza: n! = n*(n-1)*(n-2)*...2*1. La prima definizione data è di tipo ricorsivo: il fattoriale di un numero viene calcolato come prodotto del numero stesso per il fattoriale del numero che lo precede. Affinché il procedimento sia finito si assume in pratica la posizione: 0! = 1.

/* Fattoriale di un numero */ #include …… int calcFatt(int numero); int main() { int n,fat; printf("\nCalcola il fattoriale di un numero"); printf("\n\nIntrodurre il numero "); scanf("%d",&n); fat=calcFatt(n); printf("\n Fattoriale di %d = %d",n,fat); system(pause);return 0; } /* Calcola Fattoriale utilizzando la Ricorsione*/ { int f; if (numero==0 || numero==1 ) f=1; else f=numero*calcFatt(numero-1); return f; }

individuare il caso base NOTA: per capire bene la ricorsione bisogna individuare il caso base interpretare il problema prima dal punto di vista matematico. 1 per x=0/1 es: fatt(x) xfatt(x-1) per x>1 es: fatt(4)=4fatt(3)=4×3×fatt(2)= 4×3×2×fatt(1)=4×3×2×1 che si traduce dal punto di vista informatico int fatt(int x) { if(x==0 || x==1) return 0; else return x*fatt(x-1); }

Esempio MCD che si traduce dal punto di vista informatico MCD(x,y) x per x=y MCD(x-y,y) x>y MCD(x,y-x) y>x es: MCD(30,18)=MCD(12,18)=MCD(12,6)=MCD(6,6)=6 che si traduce dal punto di vista informatico int MCD(int x, int y) { if(x==y) return x; else if(x>y) return MCD(x-y, y) return MCD(x, y-x) }

#include <cstdlib> #include <iostream> using namespace std; int MCD(int x, int y); int main(int argc, char *argv[]) { int A, B; cout<<"inserisci un numero"<<endl; cin>>A; cout<<"inserisci il secondo numero"<<endl; cin>>B; int m=MCD(A,B); cout<<"il MCD fra "<<A<<" e "<<B<<" è "<<m<<endl; system("PAUSE"); return EXIT_SUCCESS; } int MCD(int x, int y) {if(x==y) return x; else if(x>y) return MCD(x-y, y); return MCD(x, y-x);}

Ricorsione Multipla serie di Fibonacci: 0,1,1,2,3,5,8,13,21,34….. es: Fib(5)=Fib(+4)+Fib(3)=(Fib(3)+Fib(2))+(Fib(2)+Fib(1))=(Fib(2)+Fib(1))+(Fib(1)+Fib(0))+(Fib(1)+Fib(0))+1=(Fib(1)+Fib(0))+1+1+0+1+0+1=1+4=5 Fib(x)= 0 per x=0 1 per x=1 Fib(x-1)+Fib(x-2) per x>1 int fib(int n) { if (n==0) return 0; if (n==1) return 1; if (n>1) return fib(n-2) + fib(n-1); }

int A (int m, int n) { if(m==0) return n+1; else if(m>0 && n==o) La funzione di Ackermann è una funzione f(x,y,z) che ha come dominio l'insieme delle terne di numeri naturali e come codominio i numeri naturali. Essa è definita per ricorrenza nel seguente modo: La funzione di Ackermann è una funzione f(x,y,z) che ha come dominio l'insieme delle terne di numeri naturali e come codominio i numeri naturali. Essa è definita per ricorrenza nel seguente modo: int A (int m, int n) { if(m==0) return n+1; else if(m>0 && n==o) return A(m-1,1) return A(m-1, A(m, n-1)) }