RosettaCodeData/Task/Long-multiplication/PascalABC.NET/long-multiplication.pas

57 lines
1.1 KiB
ObjectPascal

function longmulti(a, b: string): string;
begin
var i := 0;
var j := 0;
var k := false;
// either is zero, return "0"
if (a = '0') or (b = '0') then
begin
result := '0';
exit;
end;
// see if either a or b is negative
if a[1] = '-' then
begin
i := 2;
k := not k;
end;
if b[1] = '-' then
begin
j := 2;
k := not k;
end;
// if yes, prepend minus sign if needed and skip the sign
if (i > 1) or (j > 1) then
begin
result := if k then '-' else '';
result += longmulti(a[i:a.Length + 1], b[j:b.Length + 1]);
exit;
end;
result := '0' * (a.length + b.length);
for var ii := a.length downto 1 do
begin
var carry := 0;
var kk := ii + b.length;
for var jj := b.length downto 1 do
begin
var n := a[ii].todigit * b[jj].todigit + result[kk].todigit + carry;
carry := n div 10;
result[kk] := chr(n mod 10 + ord('0'));
dec(kk);
end;
result[kk] := chr(ord(result[kk]) + carry);
end;
if result[1] = '0' then
result[1:result.length] := result[2:result.length + 1];
end;
begin
longmulti('-18446744073709551616', '-18446744073709551616').println;
end.