题目: | 表达式计算2 | |
来源: | Tyvj 1041 | |
题目大意: | 给定一个有加减号的长式子,求最后的答案 | |
数据范围: | 表达式总长度<=255 | |
样例: | 1+1-1 | 1 |
做题思路: | 255,string就好,ansistring懒得改了,然后读表达式,每次读入一个符号,然后记录,然后用上次读入 的那个,也就是第一个数就是第一个数,再然后没了 | |
知识点: | 高精度加法、高精度减法 |
var
a,a1,a2:array[0..1000]of longint;
n,l:longint;
ch,cht:char;
s,s1:ansistring;
procedure init;
var
i,j,k:longint;
begin
fillchar(a,sizeof(a),0);
j:=ldiv 4;
fori:=1 to j do
fork:=4 downto 1 do
a[i]:=a[i]*10+ord(s[l-(i-1)*4-k+1])-ord('0');
i:=ldiv 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;
procedure subt;
var
i:longint;
begin
fillchar(a,sizeof(a),0);
a[0]:=a1[0];
fori:=1 to a[0]-1 do
begin
a[i]:=a[i]+a1[i]-a2[i];
while a[i]<0 do
begin
dec(a[i+1]);
inc(a[i],10000)
end;
end;
a[a[0]]:=a[a[0]]+a1[a[0]]-a2[a[0]];{<加法没的可提,减法记得最高位也可以退位啊>}
end;
begin
while not eoln do
begin
cht:=ch;
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;
ifcht='' then addi
else
case cht of{<答案与该数加减处理>}
'+':addi;
'-':subt;
end;
end;
print;
end.
题目来源:
http://www.tyvj.cn:8080/Problem_Show.asp?id=1041