这个题比表达式求值既高级又低级.高级在需要算阶乘,低级在没有括号问题
在求阶乘的时候,如果我们直接自己写函数,那么就会诱发超时或者超空间.因此有位大佬运用预处理的方式成功AC了,向她致敬
#include<iostream>
#include<cmath>
using namespace std;
const int N=65536;
int f[N];//存储阶乘结果
string a;
bool flag;
int power(int x, int y)//递归式快速幂
{
int temp;
if(y == 0)
return 1;
temp = power(x, (y/2));
if (y%2 == 0)
return (temp*temp)%N;
else
{
if(y>0)
return (x*temp*temp)%N;
else
return ((temp*temp)/x)%N;
}
}
int power2(int x,int y)//非递归式快速幂
{
if(y==0)return 1;
long long sum=1;//防止爆数据
while(y)
{
if(y&1)
{
sum=sum*x%N;
}
x=x*x%N;
y=y>>1;
}
return sum;
}
int zhuan(int l,int r)
{
int sum=0;
for(int i=l;i<=r;i++)
sum=sum*10+a[i]-'0';
return sum;
}
int cal(int l,int r)
{
int pos1=-1,pos2=-1,pos3=-1,pos4=-1;
for(int i=l;i<=r;i++)
{
if(a[i]=='+'||a[i]=='-') pos1=i;
if(a[i]=='*'||a[i]=='/') pos2=i;
if(a[i]=='^') pos3=i;
if(a[i]=='!')pos4=i;
}
if(pos1==-1&&pos2==-1&&pos3==-1&&pos4==-1)
return zhuan(l,r);
else if(pos1!=-1)
{
if(a[pos1]=='+')return (cal(l,pos1-1)+cal(pos1+1,r))%N;
else return (cal(l,pos1-1)-cal(pos1+1,r))%N;
}
else if(pos2!=-1)
{
if(a[pos2]=='*')return (cal(l,pos2-1)*cal(pos2+1,r))%N;
else
{
if(cal(pos2+1,r)==0)
flag=1;
else return (cal(l,pos2-1)/cal(pos2+1,r))%N;
}
}
else if(pos3!=-1)
{
return power(cal(l,pos3-1),cal(pos3+1,r));
}
else if(pos4!=-1)
{
int a=cal(l,pos4-1);
return f[a];
}
return 0;
}
int main()
{
int T;
cin>>T;
f[0]=1;
for(int i=1;i<N;i++)
f[i]=f[i-1]*i%N;
while(T--)
{
cin>>a;
flag=0;
int res=cal(0,a.size()-1);
if(!flag)cout<<res<<endl;
else cout<<"ArithmeticException"<<endl;
}
return 0;
}