Esercizi svolti a lezione il 26 Ottobre 2000 & Esercizi proposti
program Moltiplicazione_veloce;
{pre: n,m>=0 interi}
{post: calcolo e stampa di n*m ottenuto velocizzando l'iterazione
della somma sulla base delle identita':
x * 2y = (x+x) * y
x * (2y+1) = (x+x) * y + x
}
var n, m, p, q, r: integer;
begin
readln(n,m);
p:= n; q:= m; r:= 0; {r + p*q = n*m}
while q>0 do
begin
if (q mod 2 = 1) then r:= r+p;
p:= p+p;
q:= q div 2
{INVARIANTE: sia q' = q div 2;
se q = 2q'+1 allora r + p*q = r + p + 2p*q'
se q = 2q' allora r + p*q = r + 2p*q'}
end;
writeln(r) {q = 0, dunque r = r + p*0 = n*m}
end.
NOTA: Rispetto agli algoritmi per calcolare la moltiplicazione iterando
la somma presentati a lezione il 5 Ottobre, questo algoritmo fa
*meno* somme. Il numero di somme fatte dai primi due algoritmi e` m,
mentre questo algoritmo ne fa un numero proporzionale al log_2(m).
Si dice che il secondo algoritmo ha "complessita` minore in termini di
tempo" rispetto agli altri due.
Array: Esercizi proposti
Esercizi
1. Dato un array di interi, trovare il massimo intero contenuto
nell'array (questo esercizio lo avete gia` visto in aula, ma vale
la pena che lo riscriviate e lo decoriate con le asserzioni
opportune).
2. Dato un array di interi, ordinarlo in ordine crescente.