81 lines
2.2 KiB
Text
81 lines
2.2 KiB
Text
procedure multiplyBCD (m, n, u, v, w);
|
||
comment
|
||
Multiply array u of length m by array v of length n,
|
||
putting the result in array w of length (m + n). the
|
||
numbers are stored as binary coded decimal, most
|
||
significant digit first.
|
||
;
|
||
value m, n;
|
||
integer m, n;
|
||
integer array u, v, w;
|
||
begin
|
||
integer i, j, carry, t;
|
||
|
||
for j := 0 step 1 until n - 1 do
|
||
begin
|
||
if v[n - 1 - j] = 0 then
|
||
begin
|
||
comment (optional branch);
|
||
w[n - 1 - j] := 0
|
||
end
|
||
else
|
||
begin
|
||
carry := 0;
|
||
for i := 0 step 1 until m - 1 do
|
||
begin
|
||
t := (u[m - 1 - i] * v[n - 1 - j])
|
||
+ w[m + n - 1 - i - j] + carry;
|
||
carry := t % 10; comment (integer division);
|
||
w[m + n - 1 - i - j] := t - (carry * 10)
|
||
end;
|
||
w[n - 1 - j] := carry
|
||
end
|
||
end
|
||
end;
|
||
|
||
procedure printBCD (m, u);
|
||
value m;
|
||
integer m;
|
||
integer array u;
|
||
begin
|
||
integer i, j;
|
||
|
||
comment Skip leading zeros;
|
||
i := 0;
|
||
for j := i while j < m - 1 & u[j] = 0 do
|
||
i := i + 1;
|
||
|
||
comment Print the digits, and separators;
|
||
for j := i step 1 until m - 1 do
|
||
begin
|
||
if j != i & ((m - j) % 3) * 3 = m - j then
|
||
begin
|
||
comment Print UTF-8 for a narrow no-break space (U+202F);
|
||
outstring (1, "\xE2\x80\xAF")
|
||
end;
|
||
outchar (1, "0123456789", u[j] + 1)
|
||
end
|
||
end;
|
||
|
||
begin
|
||
integer array u[0 : 19];
|
||
integer array v[0 : 19];
|
||
integer array w[0 : 39];
|
||
|
||
u[0] := 1; u[1] := 8; u[2] := 4; u[3] := 4;
|
||
u[4] := 6; u[5] := 7; u[6] := 4; u[7] := 4;
|
||
u[8] := 0; u[9] := 7; u[10] := 3; u[11] := 7;
|
||
u[12] := 0; u[13] := 9; u[14] := 5; u[15] := 5;
|
||
u[16] := 1; u[17] := 6; u[18] := 1; u[19] := 6;
|
||
|
||
v[0] := 1; v[1] := 8; v[2] := 4; v[3] := 4;
|
||
v[4] := 6; v[5] := 7; v[6] := 4; v[7] := 4;
|
||
v[8] := 0; v[9] := 7; v[10] := 3; v[11] := 7;
|
||
v[12] := 0; v[13] := 9; v[14] := 5; v[15] := 5;
|
||
v[16] := 1; v[17] := 6; v[18] := 1; v[19] := 6;
|
||
|
||
multiplyBCD (20, 20, u, v, w);
|
||
outstring (1, "u = "); printBCD (20, u); outstring (1, "\n");
|
||
outstring (1, "v = "); printBCD (20, v); outstring (1, "\n");
|
||
outstring (1, "u × v = "); printBCD (40, w); outstring (1, "\n")
|
||
end
|