没事爬天梯顺便水水各种高精度....
========================
1..高精度加法
procedure highadd(a,b:arr;var c:arr);
var i,j:longint;
begin
j:=a[0];if j<b[0] then j:=b[0];
for i:=1 to j do c[i]:=0;
for i:=1 to j do
begin
c[i]:=c[i]+a[i]+b[i];
c[i+1]:=c[i+1]+(c[i] div 10);
c[i]:=c[i] mod 10;
end;
j:=j+2;
while (j>0)and(c[j]=0)do dec(j);
c[0]:=j;
end;
=========================
2.高精度减法(只适用于大减小,负数的情况特判下)
procedure highdec(var a,b,c:arr);
var i,j:longint;
begin
for i:=1 to a[0] do c[i]:=0;
for i:=1 to a[0] do
begin
if c[i]+a[i]-b[i]<0 then
begin
c[i]:=c[i]+a[i]+10-b[i];
c[i+1]:=c[i+1]-1;
end
else c[i]:=c[i]+a[i]-b[i];
end;
j:=a[0];
while (j>0)and(c[j]=0) do dec(j);
c[0]:=j;
end;
==========================
3..高精度乘法
procedure highcheng(a,b:arr;var c:arr);
var i,j:longint;
begin
for i:=1 to a[0]+b[0]+2 do
c[i]:=0;
for i:=1 to a[0] do
for j:=1 to b[0] do
begin
c[i+j-1]:=c[i+j-1]+a[i]*b[j];
c[i+j]:=c[i+j]+(c[i+j-1] div 10);
c[i+j-1]:=c[i+j-1] mod 10;
end;
j:=a[0]+b[0]+1;
while (j>0)and(c[j]=0) do dec(j);
c[0]:=j;
end;
==========================
4.高精度除法(模拟人工除法,不试除直接减,最多减9次,包含比较两高精度数大小,高精减和人工移位)
procedure mul(var a:arr);
var i:longint;
begin
for i:=a[0] downto 1 do
a[i+1]:=a[i];
a[1]:=0;
inc(a[0]);
end;
procedure highdec(a,b:arr;var c:arr);
var i:longint;
begin
for i:=1 to a[0] do c[i]:=0;
for i:=1 to a[0] do
if c[i]+a[i]-b[i]<0 then
begin
c[i]:=c[i]+a[i]+10-b[i];
dec(c[i+1]);
end
else c[i]:=c[i]+a[i]-b[i];
i:=a[0];
while (i>0)and(c[i]=0) do dec(i);
c[0]:=i;
end;
function cmq(var a,b:arr):boolean;
var i:longint;
begin
if a[0]>b[0] then exit(true);
if b[0]>a[0] then exit(false);
for i:=a[0] downto 1 do
begin
if a[i]>b[i] then exit(true);
if b[i]>a[i] then exit(false);
end;
exit(true);
end;
procedure highchu(a,b:arr;var c:arr);
var i:longint;
begin
for i:=1 to a[0] do begin c[i]:=0;d[i]:=0;end;
for i:=a[0] downto 1 do
begin
mul(d);
d[1]:=d[1]+a[i];
while cmq(d,b) do
begin
highdec(d,b,d);
inc(c[i]);
end;
end;
i:=a[0];
while (i>0)and(c[i]=0)do dec(i);
c[0]:=i;
end;
评论