描述 Description
给出一个表达式,其中运算符仅包含+,要求求出表达式的最终值
输入格式 Input Format
仅一行,即为表达式
输出格式 Output Format
仅一行,既为表达式算出的结果
样例输入 Sample Input [复制数据]
1+1
样例输出 Sample Output [复制数据]
2
时间限制 Time Limitation
各个测试点1s
注释 Hint
表达式总长度<=1500
数据肯定不是A+A这么简单,那样就是高精度加法,所以要用字符串处理,因为<=1500,所以ansistring。
表达式的计算2
描述 Description
给出一个表达式,其中运算符仅包含+,-,要求求出表达式的最终值
保证数据中不会出现负数,并且同时保证,如果你按从左到右的顺序计算,同样也不会出现负数的情况。
输入格式 Input Format
仅一行,即为表达式
输出格式 Output Format
仅一行,既为表达式算出的结果
样例输入 Sample Input [复制数据]
1+1-1
样例输出 Sample Output [复制数据]
1
时间限制 Time Limitation
各个测试点1s
注释 Hint
表达式总长度<=255
表达式中数字位数<=255
这个就可用栈实现,如果是字符就弹出栈,数字就记录。
我是用数组实现的。
var
a,s:ansistring;
i,j,k:integer;
v:array[1..2000] of integer;
procedure plus(b:ansistring;var a:ansistring);
var
m,n:array[1..2000] of integer;
t:ansistring;
la,lb,len:integer;
begin
la:=length(a);
lb:=length(b);
fillchar(m,sizeof(m),0);
fillchar(n,sizeof(n),0);
for i:=1 to la do m[i]:=ord(a[la-i+1])-ord('0');
for i:=1 to lb do n[i]:=ord(b[lb-i+1])-ord('0');
if la>lb then
len:=la
else
len:=lb;
for i:=1 to len do
m[i]:=m[i]+n[i];
for i:=1 to len do
if m[i]>=10 then
begin
m[i+1]:=m[i+1]+m[i] div 10;
m[i]:=m[i] mod 10;
end;
a:='';
if m[len+1]<>0 then
a:=chr(m[len+1]+ord('0'));
for i:=len downto 1 do
begin
t:=chr(m[i]+ord('0'));
a:=a+t;
end;
end;
begin
readln(s);
v[1]:=0;
k:=1;
for i:=1 to length(s) do
if s[i]='+' then
begin
k:=k+1;
v[k]:=i;
end;
v[k+1]:=length(s)+1;
a:='0';
for j:=1 to k do
plus(copy(s,v[j]+1,v[j+1]-v[j]-1),a);
writeln(a);
end.
var
a,s:ansistring;
i,j,k:integer;
v,p:array[1..2000] of integer;
procedure plus(b:ansistring;var a:ansistring);
var
m,n:array[1..2000] of integer;
t:ansistring;
la,lb,len:integer;
begin
la:=length(a);
lb:=length(b);
fillchar(m,sizeof(m),0);
fillchar(n,sizeof(n),0);
for i:=1 to la do m[i]:=ord(a[la-i+1])-ord('0');
for i:=1 to lb do n[i]:=ord(b[lb-i+1])-ord('0');
if la>lb then
len:=la
else
len:=lb;
for i:=1 to len do
m[i]:=m[i]+n[i];
for i:=1 to len do
if m[i]>=10 then
begin
m[i+1]:=m[i+1]+m[i] div 10;
m[i]:=m[i] mod 10;
end;
a:='';
if m[len+1]<>0 then
a:=chr(m[len+1]+ord('0'));
for i:=len downto 1 do
begin
t:=chr(m[i]+ord('0'));
a:=a+t;
end;
end;
procedure minus(b:ansistring;var a:ansistring);
var
m,n:array[1..2000] of integer;
t:ansistring;
la,lb,len:integer;
begin
la:=length(a);
lb:=length(b);
fillchar(m,sizeof(m),0);
fillchar(n,sizeof(n),0);
for i:=1 to la do m[i]:=ord(a[la-i+1])-ord('0');
for i:=1 to lb do n[i]:=ord(b[lb-i+1])-ord('0');
if la>lb then
len:=la
else
len:=lb;
for i:=1 to len do
if m[i]>=n[i] then
m[i]:=m[i]-n[i]
else
begin
m[i]:=m[i]+10-n[i];
m[i+1]:=m[i+1]-1;
end;
a:='';
i:=255;
while m[i]=0 do
i:=i-1;
len:=i;
for i:=len downto 1 do
begin
t:=chr(m[i]+ord('0'));
a:=a+t;
end;
end;
begin
readln(s);
v[1]:=0;
p[1]:=1;
k:=1;
for i:=1 to length(s) do
if s[i]='+' then
begin
k:=k+1;
v[k]:=i;
p[k]:=1;
end
else
if s[i]='-' then
begin
k:=k+1;
v[k]:=i;
p[k]:=0;
end;
v[k+1]:=length(s)+1;
a:='0';
for j:=1 to k do
if p[j]=1 then
plus(copy(s,v[j]+1,v[j+1]-v[j]-1),a)
else
if p[j]=0 then
minus(copy(s,v[j]+1,v[j+1]-v[j]-1),a);
writeln(a);
end.
表达式的计算3
描述 Description
给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值
在这里,"/"为整除
最终结果为正整数,数据保证不需要使用高精度!
输入格式 Input Format
仅一行,即为表达式
输出格式 Output Format
仅一行,既为表达式算出的结果 结果小于maxlongint,且整个计算的过程中,也不会超过maxlongint
样例输入 Sample Input [复制数据]
2^3+1
样例输出 Sample Output [复制数据]
9
时间限制 Time Limitation
各个测试点1s
注释 Hint
表达式总长度<=20
我居然写得比1041还短,证明还是可以优化一下的。
var
s:string;
function fh(i:integer):boolean;
begin
if (s[i]='+') or (s[i]='-') or (s[i]='*') or (s[i]='/') or (s[i]='^') then
fh:=true
else
fh:=false;
end;
function work(l,r:integer):longint;
var
i,t,k,code:integer;
x:char;
m,n:longint;
begin
t:=0;
for i:=l to r do
if fh(i) then
t:=t+1;
if t=0 then val(copy(s,l,r-l+1),work,code) else
if t=1 then
begin
for i:=l to r do
if fh(i) then
break;
val(copy(s,l,i-l),m,code);
val(copy(s,i+1,r-i),n,code);
case s[i] of
'+': work:=m+n;
'-': work:=m-n;
'*': work:=m*n;
'/': work:=m div n;
'^': begin
work:=1;
for k:=1 to n do
work:=work*m;
end;
end;
end
else
begin
for i:=l to r do
if fh(i) then
if s[i]='+' then
begin
x:='+';
k:=i;
end
else
if (s[i]='-') and (x<>'+') then
begin
x:='-';
k:=i;
end
else
if (s[i]='*') and (x<>'+') and (x<>'-') then
begin
x:='*';
k:=i;
end
else
if (s[i]='/') and (x<>'+') and (x<>'-') and (x<>'*') then
begin
x:='/';
k:=i;
end
else
if (s[i]='^') and (x<>'+') and (x<>'-') and (x<>'*') and (x<>'/') then
begin
x:='^';
k:=i;
end;
m:=work(l,k-1);
n:=work(k+1,r);
case x of
'+': work:=m+n;
'-': work:=m-n;
'*': work:=m*n;
'/': work:=m div n;
'^': begin
work:=1;
for i:=1 to n do
work:=work*m;
end;
end;
end;
end;
begin
readln(s);
writeln(work(1,length(s)));
end.