2131 - [数值问题]高精度加法
【问题描述】
输入两个高精度正整数a和b(a,b的位数<=200),求这两个数的和
【输入格式】
<span>输入共两行,分别为a和b</span>
<span>【输出格式】</span>
<span>输出共一行,表示两个数的和。</span>
<span>【输入样例1】 </span><br />
1111111111111111111111111111111111
9999999999999999999999999999999999
<br />
<span>【输出样例1】</span>
11111111111111111111111111111111110
<span style="line-height:1.5;"></span>
<br />
题目输入
题目输出
输入/输出样例
题目输入
题目输出
提示
Const
SIZE = 200+1;
Type
hugeint = Record
len : Integer;
num : Array[1..SIZE] Of Integer;
End;
var a,b:hugeint;
s1,s2:string;
i:integer;
procedure add(a, b : hugeint);
Var
i : Integer;
ans : hugeint;
Begin
FillChar(ans.num, SizeOf(ans.num), 0);
If a.len > b.len
Then ans.len := a.len
Else ans.len := b.len;
For i := 1 To ans.len Do
Begin
ans.num[i] :=ans.num[i]+a.num[i]+b.num[i];
ans.num[i + 1] := ans.num[i + 1] + ans.num[i] DIV 10;
ans.num[i] := ans.num[i] MOD 10;
End;
If ans.num[ans.len + 1] > 0
Then Inc(ans.len);
for i:=ans.len downto 1 do write(ans.num[i]);
writeln;
End;
procedure datain;
begin
assign(input,'highplus.in'); assign(output,'highplus.out');
reset(input); rewrite(output);
readln(s1);
readln(s2);
a.len:=length(s1);
b.len:=length(s2);
for i:=1 to a.len do a.num[i]:=ord(s1[a.len-i+1])-ord('0');
for i:=1 to b.len do b.num[i]:=ord(s2[b.len-i+1])-ord('0');
end;
begin
datain;
add(a,b);
close(input);close(output);
end.<br />
C++解答
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int main(){ char a1[200],b1[200]; int a[200],b[200],c[200],lena,lenb,lenc; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); gets(a1); gets(b1); lena=strlen(a1); lenb=strlen(b1); for (int i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48; for (int i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48; lenc=lena>lenb?lena:lenb; for (int i=0;i<lenc;i++){ c[i]=c[i]+a[i]+b[i]; c[i+1]=c[i+1]+c[i] / 10; c[i]=c[i]% 10; } if (c[lenc]>0) lenc+=1; for (int i=lenc-1;i>=0;i--) cout <<c[i]; cout<<endl; return 0; }
提示
Const
SIZE = 200+1;
Type
hugeint = Record
len : Integer;
num : Array[1..SIZE] Of Integer;
End;
var a,b:hugeint;
s1,s2:string;
i:integer;
procedure add(a, b : hugeint);
Var
i : Integer;
ans : hugeint;
Begin
FillChar(ans.num, SizeOf(ans.num), 0);
If a.len > b.len
Then ans.len := a.len
Else ans.len := b.len;
For i := 1 To ans.len Do
Begin
ans.num[i] :=ans.num[i]+a.num[i]+b.num[i];
ans.num[i + 1] := ans.num[i + 1] + ans.num[i] DIV 10;
ans.num[i] := ans.num[i] MOD 10;
End;
If ans.num[ans.len + 1] > 0
Then Inc(ans.len);
for i:=ans.len downto 1 do write(ans.num[i]);
writeln;
End;
procedure datain;
begin
assign(input,'highplus.in'); assign(output,'highplus.out');
reset(input); rewrite(output);
readln(s1);
readln(s2);
a.len:=length(s1);
b.len:=length(s2);
for i:=1 to a.len do a.num[i]:=ord(s1[a.len-i+1])-ord('0');
for i:=1 to b.len do b.num[i]:=ord(s2[b.len-i+1])-ord('0');
end;
begin
datain;
add(a,b);
close(input);close(output);
end.
<br />