加法1:(考虑有效位)jzOJ实测48ms

const
    Max=250;
type
    hint=array[0..Max] of longint;
var
    a,b:hint;
    sa,sb:string;
    i:longint;

begin
    readln(sa); readln(sb);
    a[Max]:=length(sa); b[Max]:=length(sb);
    for i:=1 to a[Max] do a[a[Max]-i]:=ord(sa[i])-48;
    for i:=1 to b[Max] do b[b[Max]-i]:=ord(sb[i])-48;
    if b[Max]>a[Max] then a[Max]:=b[Max];
    dec(a[max]);
    for i:=0 to a[Max] do
    begin
        inc(a[i],b[i]);
        inc(a[i+1],ord(a[i]>9));
        a[i]:=a[i] mod 10;
    end;
    if a[a[Max]+1]<>0 then inc(a[max]);
    for i:=a[max] downto 0 do write(a[i]);
    writeln;
end.

 

加法2:(不考虑有效位)实测0ms

var
    a,b:array[1..250] of longint;
    sa,sb:string;
    i,j,la,lb:longint;
begin
    readln(sa); readln(sb);
    la:=length(sa); lb:=length(sb);
    for i:=1 to la do a[i]:=ord(sa[la+1-i])-48;
    for i:=1 to lb do b[i]:=ord(sb[lb+1-i])-48;
    for i:=1 to 249 do
    begin
        a[i+1]:=a[i+1]+(a[i]+b[i]) div 10;
        a[i]:=(a[i]+b[i]) mod 10;
    end;
    for i:=250 downto 1 do
        if a[i]<>0 then break;
    for j:=i downto 1 do write(a[j]);
    writeln;
end.

 实测8ms

var
    a,b:array[0..250] of longint;
    sa,sb:string;
    i,j,la,lb:longint;
begin
    readln(sa); readln(sb);
    la:=length(sa); lb:=length(sb);
    for i:=1 to la do a[la-i]:=ord(sa[i])-48;
    for i:=1 to lb do b[lb-i]:=ord(sb[i])-48;
    for i:=0 to 249 do
    begin
        a[i+1]:=a[i+1]+(a[i]+b[i]) div 10;
        a[i]:=(a[i]+b[i]) mod 10;
    end;
    for i:=250 downto 0 do
        if a[i]<>0 then break;
    for j:=i downto 0 do write(a[j]);
    writeln;
end.

 

 减法

var
    a,b:array[0..1010] of longint;
    sa,sb,st:string;
    i,j,la,lb,t:longint;
begin
    readln(sa); readln(sb);
    if(sa=sb) then begin writeln(0); halt; end;
    la:=length(sa); lb:=length(sb);
    if(la<lb)or(la=lb)and(sa<sb) then
    begin
        write('-');
        st:=sa; sa:=sb; sb:=st;
        t:=la; la:=lb; lb:=t;
    end;
    for i:=1 to la do a[la-i]:=ord(sa[i])-48;
    for i:=1 to lb do b[lb-i]:=ord(sb[i])-48;
    for i:=0 to 1009 do
    begin
        a[i+1]:=a[i+1]-ord(a[i]<b[i]);
        a[i]:=(10+a[i]-b[i]) mod 10;
    end;
    for i:=1010 downto 0 do
        if a[i]<>0 then break;
    for j:=i downto 0 do write(a[j]);
    writeln;
end.

 

 

高精度算法

转载于:https://www.cnblogs.com/qilinart/articles/3617098.html

相关文章: