2132 - [数值问题]高精度减法
【问题描述】
输入两个高精度正整数a和b(a,b的位数<=200),求a-b的差
【输入格式】
<span>输入共两行,分别为a和b</span>
<span>【输出格式】</span>
<span>输出共一行,表示两个数的差,若a小于b,则先输出负号。</span>
<span>【输入样例1】 </span><span><br />
9999999999999999999999999999999999
<span style="font-family:'Microsoft Yahei';font-size:14px;line-height:21px;background-color:#F5F5F5;">1111111111111111111111111111111111</span>
<span>【输出样例1】</span>
8888888888888888888888888888888888
题目输入
题目输出
输入/输出样例
题目输入
题目输出
提示
Const
SIZE = 200;
Type
hugeint = Record
len : Integer;
num : Array[1..SIZE] Of Integer;
End;
var a,b:hugeint;
s1,s2:string;
i:integer;
Function over(a, b : hugeint) : integer;
Var
i : Integer;
Begin
If (a.len>b.len) Then
Begin
over :=1 ;
Exit;
End;
If a.len < b.len Then
Begin
over := 2;
Exit;
End;
For i := a.len DownTo 1 Do
Begin
If a.num[i] > b.num[i] Then
Begin
over := 1;
Exit;
End;
If a.num[i] < b.num[i] Then
Begin
over := 2;
Exit;
End;
End;
over := 3;
End;
procedure minus(a,b:hugeint);
var
i:longint;
t,ans:hugeint;
begin
fillchar(ans.num,sizeof(ans.num),0);
if over(a,b)=2 then
begin
write('-');
t:=a;a:=b;b:=t;
end;
if over(a,b)=3 then begin writeln(0);exit;end;
ans.len:=a.len;
for i:=1 to ans.len do ans.num[i]:=a.num[i]-b.num[i];
for i:=1 to ans.len do
if ans.num[i]<0 then
begin
dec(ans.num[i+1]);
inc(ans.num[i],10);
end;
while (ans.len>1)and(ans.num
[ans.len]=0) do dec(ans.len);
for i:=ans.len downto 1 do write(ans.num[i]);
writeln;
end;
procedure datain;
begin
assign(input,'highminus.in'); assign(output,'highminus.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;
minus(a,b);
close(input);close(output);
end.<br /><br />
C++解答
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int main(){ int a[256],b[256],c[256],lena,lenb,lenc,i; char s[256],s1[256],s2[256]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); gets(s1); gets(s2); if(strlen(s1)<strlen(s2)||(strlen(s1)==strlen(s2)&&strcmp(s1,s2)<0)){ strcpy(s,s1); strcpy(s1,s2); strcpy(s2,s); cout <<"-"; } lena=strlen(s1); lenb=strlen(s2); for(i=0;i<=lena-1;i++) a[lena-i]=s1[i]-48; for(i=0;i<=lenb-1;i++) b[lenb-i]=s2[i]-48; for(i=1;i<=lena;i++){ c[i]=a[i]-b[i]; if (c[i]<0){ c[i]+=10; c[i+1]--; } } lenc=lena+1; while (c[lenc]==0) lenc--; for(i=lenc;i>=1;i--) { cout<<c[i];} cout<<endl; return 0; }
提示
Const
SIZE = 200;
Type
hugeint = Record
len : Integer;
num : Array[1..SIZE] Of Integer;
End;
var a,b:hugeint;
s1,s2:string;
i:integer;
Function over(a, b : hugeint) : integer;
Var
i : Integer;
Begin
If (a.len>b.len) Then
Begin
over :=1 ;
Exit;
End;
If a.len < b.len Then
Begin
over := 2;
Exit;
End;
For i := a.len DownTo 1 Do
Begin
If a.num[i] > b.num[i] Then
Begin
over := 1;
Exit;
End;
If a.num[i] < b.num[i] Then
Begin
over := 2;
Exit;
End;
End;
over := 3;
End;
procedure minus(a,b:hugeint);
var
i:longint;
t,ans:hugeint;
begin
fillchar(ans.num,sizeof(ans.num),0);
if over(a,b)=2 then
begin
write('-');
t:=a;a:=b;b:=t;
end;
if over(a,b)=3 then begin writeln(0);exit;end;
ans.len:=a.len;
for i:=1 to ans.len do ans.num[i]:=a.num[i]-b.num[i];
for i:=1 to ans.len do
if ans.num[i]<0 then
begin
dec(ans.num[i+1]);
inc(ans.num[i],10);
end;
while (ans.len>1)and(ans.num
[ans.len]=0) do dec(ans.len);
for i:=ans.len downto 1 do write(ans.num[i]);
writeln;
end;
procedure datain;
begin
assign(input,'highminus.in'); assign(output,'highminus.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;
minus(a,b);
close(input);close(output);
end.
<br />
<br />