题解
2023-03-11 22:37:50
发布于:上海
#include<cstdio>
#include<cmath>
#include <iostream>
#include<cstring>
using namespace std;
char w[55],c[128];
int n,x,t1,t2,a[100];
long long check[5],c1[55],c2[55],c3[55];//用三个质数作为特殊值
int pow(int a,int b)
{
int s=a;
for (int i=2;i<=b;i++) s=(sa+10007)%10007;//防止越界
return s;
}
void ys()//注意这是ys
{
int m1=c1[t2],n1=c1[t2-1],m2=c2[t2],n2=c2[t2-1],m3=c3[t2],n3=c3[--t2];
switch(w[t1])//同时对三个特殊值进行运算 数字栈为别为c1 c2 c3 符号栈为相同的w栈
{
case '+':c1[t2]=(n1+m1+10007)%10007; c2[t2]=(n2+m2+10007)%10007; c3[t2]=(n3+m3+10007)%10007; break;
case '-':c1[t2]=(n1-m1+10007)%10007; c2[t2]=(n2-m2+10007)%10007; c3[t2]=(n3-m3+10007)%10007; break;
case '':c1[t2]=(n1m1+10007)%10007; c2[t2]=(n2m2+10007)%10007; c3[t2]=(n3m3+10007)%10007; break;
case '^':c1[t2]=pow(n1,m1); c2[t2]=pow(n2,m2); c3[t2]=pow(n3,m3); break;
}
t1--;//运算完毕后运算符出栈
}
void js()
{
x=0;
for (int i=0;i<strlen(c);i++)
{
if (c[i]=='a')
{
c1[++t2]=3;//c[1]=3
c2[t2]=7;
c3[t2]=13;
} //是变量直接进栈
else if (c[i]>='0'&&c[i]<='9') x=x10+c[i]-48;//可能有多位数字出现 在出现符号前进行累加
else//是字符进行处理
{
if (x!=0)
{
c1[++t2]=x;
c2[t2]=x;
c3[t2]=x;
x=0;
}//数字入栈
if (a[c[i]]0) continue;
if (c[i]'('||t10&&c[i]!=')') w[++t1]=c[i];//第一个操作符入栈
else
if (a[c[i]]<a[w[t1]])//当前读入字符优先级高
if (c[i]!=')')
w[++t1]=c[i];
else//不是右括号则进栈 若读进右括号要进行计算
{
while (w[t1]!='('&&t1>0) ys();//计算到左括号停止
if (w[t1]'(') t1--;//左括号出栈
}
else//当前读入字符优先级低
{
while (a[c[i]]>=a[w[t1]]&&t1>0) ys();//将比当前字符优先级低的都计算完
if (c[i]!=')') w[t1]=c[i];//读入的字符进栈
}
}
}
if (x!=0) {c1[t2]=x; c2[t2]=x; c3[t2]=x; x=0;}
while (t1>0) ys();//将栈中剩下的同级运算符都做完
}
int main()
{
// freopen("equal.in","r",stdin);
// freopen("equal.out","w",stdout);
//设置各符号的优先级 数值越小优先级越高
a[40]=5;//表示(
a[41]=1;//表示)
a[94]=2;//表示幂
a[42]=a[47]=3;//表示* /
a[43]=a[45]=4;//表示+ -
t1=t2=0;//这句话不加也行,因为C 11标准,全局变量自动赋值为0
fgets( c, sizeof(c), stdin );
scanf("%d",&n);
js();
fgets( c, sizeof(c), stdin );//去回车
check[1]=c1[1];
check[2]=c2[1];
check[3]=c3[1];//以题干代数式得到的三个值为标准check
for (int i=1;i<=n;i)
{
t1=t2=0;
fgets( c, sizeof(c), stdin );
js();
if (check[1]==c1[1]%10007&&check[2]==c2[1]%10007&&check[3]==c3[1]%10007)
printf("%c",i+64);//若三个质数运算得到的结果与标准相同则输出编号
}
fclose(stdin); //关闭输入流
fclose(stdout);//关闭输出流
return 0;
}
这里空空如也
有帮助,赞一个