题目: | 表达式计算 | |
来源: | Tyvj 1040 | |
题目大意: | 给定一个只有加号的长式子,求最后的答案 | |
数据范围: | 表达式总长度<=1500 | |
样例: | 1+1 | 2 |
做题思路: | 长度1500,string不行了,ansistring吧,不过copy等不能用了。 高精度加法,因为长度太大万一有一个大大的数呢,事实证明是有滴 | |
知识点: | 高精度加法 |
var
a,a1,a2:array[0..1000]of longint;
n,l:longint;
ch:char;
s,s1:ansistring;
procedure init;
var
i,j,k:longint;
begin
fillchar(a,sizeof(a),0);
j:=l div 4;
for i:=1 to j do
for k:=4 downto 1 do
a[i]:=a[i]*10+ord(s[l-(i-1)*4-k+1])-ord('0');
i:=l div 4+1;
forj:=l mod 4 downto 1 do
a[i]:=a[i]*10+ord(s[l-(i-1)*4-j+1])-ord('0');
a[0]:=(l-1)div 4+1;
while (a[a[0]]=0)and(a[0]>0) do dec(a[0]);
end;
procedure print;
var
i:longint;
begin
while (a[a[0]]=0)and(a[0]>0) do dec(a[0]);
ifa[0]=0 then writeln('0')
else
begin
write(a[a[0]]);
for i:=a[0]-1 downto 1 do
case a[i] of
0..9:write('000',a[i]);
10..99:write('00',a[i]);
100..999:write('0',a[i]);
else write(a[i]);
end;
writeln;
end;
fillchar(a,sizeof(a),0);
end;
procedure addi;
var
i:longint;
begin
fillchar(a,sizeof(a),0);
ifa1[0]>a2[0] then a[0]:=a1[0] else a[0]:=a2[0];
fori:=1 to a[0] do
begin
a[i]:=a[i]+a1[i]+a2[i];
a[i+1]:=a[i] div 10000;
a[i]:=a[i] mod 10000;
end;
ifa[a[0]+1]>0 then inc(a[0]);
end;
begin
while not eof do
begin
read(ch);
s:=''; l:=0;
while (ord(ch)-ord('0') in [0..9] )do
begin
s:=s+ch;
inc(l);
read(ch);
end;
a1:=a;
init;
a2:=a;
addi;
end;
print;
end.
题目来源:
http://www.tyvj.cn:8080/Problem_Show.asp?id=1040