Voici un algorithme qui réalise l'exploit de multiplier 2 nombres entiers N et M en n'utilisant
que des multiplications/divisions par 2.
A chaque étape, N est divisé par 2 (division entière) et M est multiplié par 2.
Si N est impair, la valeur de M est ajoutée au futur résultat.
Exemple: 321 * 457
N M
321 457 N est impair donc futur résultat=457
160 914 N est pair donc on n'ajoute pas 914
80 1828 N est pair donc on n'ajoute pas 1828
40 3656 N est pair donc on n'ajoute pas 3656
20 7312 N est pair donc on n'ajoute pas 7312
10 14624 N est pair donc on n'ajoute pas 14624
5 29248 N est impair donc futur résultat=457+29248=29705
2 58496 N est pair donc on n'ajoute pas 58496
1 116992 N est impair donc résultat=29705+116992=146697
fonction Mult(N, M)
paramètres: N, M: entier
à valeur: entier
entier: S
S <-- 0
tant que NOT(N=1) faire
si N mod 2=1 alors S <-- S+M
fsi
N <-- N\2
M <-- M*2
ftant
S <-- S+M
résultat (S)
ou pour tirer profit des multiplications/divisions par 2
fonction Mult(N, M)
paramètres: N, M: entier
à valeur: entier
entier: S
S <-- 0
tant que NOT(N=1) faire
si N=(N SHR 1) SHL 1 alors
sinon S <-- S+M
fsi
N <-- N SHR 1
M <-- M SHL 1
ftant
S <-- S+M
résultat (S)
PROGRAM Mult;
VAR M,N,Prod,Tmp : LONGINT;
BEGIN
WRITE('1er nombre=');READLN(M);
WRITE('2ème nombre=');READLN(N);
Prod:=0;
WRITE(N,'*',M,'=');
IF N>M THEN BEGIN
Tmp:=N;
N:=M;
M:=Tmp
END;
WHILE NOT (N=0) DO
BEGIN
IF N<>(N SHR 1) SHL 1 THEN INC(Prod,M);{IF N MOD 2=1 THEN Prod:=Prod+M;}
N:=N SHR 1; {N:=N DIV 2;}
M:=M SHL 1; {M:=M*2;}
END;
WRITELN(Prod);
END.