之前题解格式有点问题
2023-10-23 21:46:08
发布于:广东
32阅读
0回复
0点赞
很抱歉给大家之前题解有格式问题
在此重附上正确代码
#include<cstdio>
#include<cstring>
#define LL long long
const int M=1e9+7;
LL n,i,p,topn,topf,len,k;
char a[51];
LL num[51];
char f[51];
LL t[11]={0,41,71,83,91,101};
LL ans[11];
char c[51];
LL quickpow(LL a,LL b,LL p)//快速幂
{
LL s=1;
a%=p;
for(;b;b>>=1,a=(a*a)%p)
if(b&1) s=(s*a)%p;
return s;
}
LL level(char c)//对运算优先级排序
{
if(c=='(') return 0;
if(c=='+'||c=='-') return 1;
if(c=='*'||c=='/') return 2;
if(c=='^') return 3;
return 0;
}
void work()//计算栈顶
{
LL x=num[topn--];
LL y=num[topn--];
char c=f[topf--];
if(c=='+') num[++topn]=(x+y)%M;
else if(c=='-') num[++topn]=(y-x+M)%M;//注意+M
else if(c=='*') num[++topn]=(x*y)%M;
else if(c=='^') num[++topn]=quickpow(y,x,M);
}
void getnum(char a[],LL &p)//把变量a改为常数
{
LL t=0;
while(a[p]>='0'&&a[p]<='9')
t=(t*10+a[p++]-48)%M;
num[++topn]=t;
}
void push(LL n)//将字符a用第n个数进行替换
{
num[++topn]=t[n];
}
LL solve(char a[],LL i)
{
p=topf=topn=0;
len=strlen(a);
while(p<=len-1)
if(a[p]>='0'&&a[p]<='9') getnum(a,p);
else if(a[p]==' ') p++;
else if(a[p]=='+'||a[p]=='-'||a[p]=='*'||a[p]=='/'||a[p]=='^')
if(level(a[p])>level(f[topf])) f[++topf]=a[p++];
else
{
while(level(a[p])<=level(f[topf])) work();
f[++topf]=a[p++];
}
else if(a[p]=='a')
{
push(i);
p++;
}
else if(a[p]=='(') f[++topf]=a[p++];
else if(a[p]==')')
{
bool bb=0;
for(int i=1;i<=topf;i++)
if(f[i]=='(') bb=1;
if(!bb)
{
p++;
continue;
}
while(f[topf]!='(')
work();
topf--;
p++;
}
while(topn!=1) work();
return num[1];
}
void get(char a[])
{
for(int i=0;i<=50;i++)
a[i]='\0';
char c=getchar();
int pos=0;
while(c=='\n'||c=='\r') c=getchar();
while(c!='\n'&&c!='\r')
{
a[pos++]=c;
c=getchar();
}
}
int main()
{ get(a);//不能用gets 自己写一个快读
for(i=1;i<=5;i++)
ans[i]=solve(a,i);
scanf("%I64d\n",&n);
for(k=1;k<=n;k++)
{
get(c);
bool b=1;
for(i=1;i<=5;i++)
if(solve(c,i)!=ans[i])
{
b=0;
break;
}
if(b) putchar('A'+k-1);
}
}
万分抱歉
请留下一个有用的赞吧!
这里空空如也
有帮助,赞一个