Long multiplication: Difference between revisions
Content added Content deleted
Not a robot (talk | contribs) (Add APL) |
(Added ALGOL 60 before →{{header|ALGOL 68}}) |
||
Line 671: | Line 671: | ||
o_form("~\n", c);</syntaxhighlight> |
o_form("~\n", c);</syntaxhighlight> |
||
=={{header|ALGOL 60}}== |
|||
{{works with|GNU MARST|2.7}} |
|||
<syntaxhighlight lang="algol60"> |
|||
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 i := 0, i + 1 while i < m - 1 & u[i] = 0 do |
|||
skipzero: ; |
|||
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 |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre>$ marst long_mult_task.algol60 > algol60-code.c && cc algol60-code.c -lalgol && ./a.out |
|||
u = 8 446 744 073 709 551 616 |
|||
v = 8 446 744 073 709 551 616 |
|||
u × v = 340 282 366 920 938 463 463 374 607 431 768 211 456</pre> |
|||
=={{header|ALGOL 68}}== |
=={{header|ALGOL 68}}== |