题目
http://oj.jzxx.net/problem.php?id=1189
题目描述
高精度减法,求(a)(-)(b)。(a)(,)(b)都不超过(240)位.
输入
两个非负整数 每行一个
输出
一个数
样例
输入33333333333333333333333333333333333333333 22222222222222222222222222222222222222222
输出
11111111111111111111111111111111111111111
提示
数据并不保证a>b,如果差是负数要输出(')(-)(')号; 另外差的高位上的(0)要去掉。
思路
先用字符串读入,再存入数组,进行高精减,但是借位要单独判断
用(l)表示是否借位,用if语句来实现(详见代码)
还有一个要单判:(a)(>)(b)
解决:先输出(')(-)('),再交换(a)(,)(b),最后进行高精
代码
var
t,s1,s2:string;
l,i,j:longint;
p:boolean;
a,b,c:array[1..240] of integer;
begin
readln(s1);
readln(s2);
if (length(s1)<length(s2))or((length(s1)=length(s2))and(s1<s2)) then
begin
t:=s1;s1:=s2;s2:=t;
p:=true;
end;//单判
l:=length(s1);
for i:=1 to l do
val(s1[l-i+1],a[i]);
l:=length(s2);
for i:=1 to l do
val(s2[l-i+1],b[i]);
l:=0;//用l来判断
for i:=1 to 240 do
if a[i]-b[i]-l>=0 then//如果不用借位
begin
c[i]:=a[i]-b[i]-l;
l:=0;//l=0
end
else//要借位
begin
c[i]:=a[i]-b[i]+10-l;
l:=1;//l=1
end;
if p then write('-');//如果是负数,则输出'-'号
i:=240;
while (c[i]=0)and(i>1) do dec(i);
for j:=i downto 1 do write(c[j]);//高精输出
end.