最近做的字符串处理问题比较多,所以这个题目直接用的字符串来处理,不需要高精,只需要注意细节。
[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.