TYVJ P1042 [表达式计算3]
最近做的字符串处理问题比较多,所以这个题目直接用的字符串来处理,不需要高精,只需要注意细节。
[pascal 代码]
VAR s,pre:string; cz:boolean; i:longint; Procedure init; begin readln(s); end; Function ysf(ch:char):boolean; begin ysf:=false; if ch='+' then exit(true); if ch='-' then exit(true); if ch='*' then exit(true); if ch='/' then exit(true); if ch='^' then exit(true); end; Function cheng(s1,s2:string):string; var a,b,c:longint; begin val(s1,a); val(s2,b); c:=a*b; str(c,cheng); end; Function jia(s1,s2:string):string; var a,b,c:longint; begin val(s1,a); val(s2,b); c:=a+b; str(c,jia); end; Function jian(s1,s2:string):string; var a,b,c:longint; begin val(s1,a); val(s2,b); c:=a-b; str(c,jian); end; Function chu(s1,s2:string):string; var a,b,c:longint; begin val(s1,a); val(s2,b); c:=a div b; str(c,chu); end; Function cf(s1,s2:string):string; var a,b,c:longint; i:longint; begin val(s1,a); val(s2,b); c:=1; for i:=1 to b do c:=c*a; str(c,cf); end; Procedure handlecf; var i,j,l,r,t:longint; s1,s2,pre:string; begin while true do begin for i:=1 to length(s) do if s[i]='^' then break; if i=length(s) then exit; for j:=i-1 downto 1 do if ysf(s[j]) then break; l:=j; if j<>1 then inc(l); for j:=i+1 to length(s) do if ysf(s[j]) then break; r:=j; if j<>length(s) then dec(r); s1:=copy(s,l,i-l); s2:=copy(s,i+1,r-i); delete(s,l,r-l+1); pre:=cf(s1,s2); insert(pre,s,l); end; end; Procedure handlechu; var i,j,l,r,t:longint; s1,s2,pre:string; begin while true do begin for i:=1 to length(s) do if s[i]='/' then break; if i=length(s) then exit; for j:=i-1 downto 1 do if ysf(s[j]) then break; l:=j; if j<>1 then inc(l); for j:=i+1 to length(s) do if ysf(s[j]) then break; r:=j; if j<>length(s) then dec(r); s1:=copy(s,l,i-l); s2:=copy(s,i+1,r-i); delete(s,l,r-l+1); pre:=chu(s1,s2); insert(pre,s,l); //writeln(s); end; end; Procedure handlecheng; var i,j,l,r,t:longint; s1,s2,pre:string; begin while true do begin for i:=1 to length(s) do if s[i]='*' then break; if i=length(s) then exit; for j:=i-1 downto 1 do if ysf(s[j]) then break; l:=j; if j<>1 then inc(l); for j:=i+1 to length(s) do if ysf(s[j]) then break; r:=j; if j<>length(s) then dec(r); s1:=copy(s,l,i-l); s2:=copy(s,i+1,r-i); delete(s,l,r-l+1); pre:=cheng(s1,s2); insert(pre,s,l); end; end; Procedure handlejia; var i,j,l,r,t:longint; s1,s2,pre:string; begin while true do begin for i:=1 to length(s) do if s[i]='+' then break; if i=length(s) then exit; for j:=i-1 downto 1 do if ysf(s[j]) then break; l:=j; if j<>1 then inc(l); for j:=i+1 to length(s) do if ysf(s[j]) then break; r:=j; if j<>length(s) then dec(r); s1:=copy(s,l,i-l); s2:=copy(s,i+1,r-i); delete(s,l,r-l+1); pre:=jia(s1,s2); insert(pre,s,l); end; end; Procedure handlejian; var i,j,l,r,t:longint; s1,s2,pre:string; begin while true do begin for i:=1 to length(s) do if s[i]='-' then break; if i=length(s) then exit; for j:=i-1 downto 1 do if ysf(s[j]) then break; l:=j; if j<>1 then inc(l); for j:=i+1 to length(s) do if ysf(s[j]) then break; r:=j; if j<>length(s) then dec(r); s1:=copy(s,l,i-l); s2:=copy(s,i+1,r-i); delete(s,l,r-l+1); pre:=jian(s1,s2); insert(pre,s,l); end; end; Begin init; handlecf; handlechu; handlecheng; handlejian; handlejia; {cz:=false; for i:=1 to length(s) do if s[i]<>'0' then cz:=true; if not cz then writeln('0') else} writeln(s); End.