等价表达式

描述

明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。

这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?

这个选择题中的每个表达式都满足下面的性质:

1. 表达式只可能包含一个变量‘a’。

2. 表达式中出现的数都是正整数,而且都小于10000。

3. 表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)

4. 幂指数只可能是1到10之间的正整数(包括1和10)。

5. 表达式内部,头部或者尾部都可能有一些多余的空格。

下面是一些合理的表达式的例子:

((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……

对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;

对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。

对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。

格式

输入格式

输入的第一行给出的是题干中的表达式。第二行是一个整数n(2 <= n <= 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……

输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。

输出格式

输出包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。

样例1

样例输入1

( a + 1) ^2
3
(a-1)^2+4*a
a  + 1+ a
a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a

样例输出1

AC

限制

1s

来源

NOIp2005 第四题

 

中缀表达式转成后缀表达式,随机带几个a的值,判断是否相等

因为有幂运算,还要找个素数mod一下

  1 #include<bits/stdc++.h>
  2 #define inf 1000000000
  3 #define maxn 10000+5
  4 #define maxm 50000+5
  5 #define eps 1e-10
  6 #define ll long long
  7 #define mod 5000011
  8 #define for0(i,n) for(int i=0;i<(n);i++)
  9 #define for1(i,n) for(int i=1;i<=(n);i++)
 10 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 11 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 12 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
 13 using namespace std;
 14 int read(){
 15     int x=0,f=1;char ch=getchar();
 16     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 17     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
 18     return x*f;
 19 }
 20 char a[maxn];
 21 int num,n;
 22 int s1[maxn];
 23 char s2[maxn];
 24 int lena;
 25 int ans1,ans2;
 26 bool cmp(char a,char b){
 27     if(b=='`'||b=='(')return 0;
 28     else{
 29         if(a=='+'||a=='-')return 1;
 30         if(a=='*'){
 31             if(b=='^')return 1;
 32             else return 0;
 33         }
 34         else return 0;
 35     }
 36 }
 37 int work(int a,char b,int c){
 38     if(b=='+')return (a+c)%mod;
 39     if(b=='-')return (a-c+mod)%mod;
 40     if(b=='*')return (a*c)%mod;
 41     ll tmp=a;
 42     for1(i,c-1)
 43         tmp=(tmp*a)%mod;
 44     return (int)tmp;
 45 }
 46 int main(){
 47     //freopen("input.txt","r",stdin);
 48     //freopen("output.txt","w",stdout);
 49     gets(a);
 50     lena=strlen(a);
 51     int head=0,tail=0;
 52     while(tail<lena){
 53         if(a[tail]!=' ')a[head++]=a[tail];
 54         tail++;
 55     }
 56     lena=head;
 57     int l=0,now=0,now2=0;
 58     s2[now2]='`';
 59     while(l<lena){
 60         int tmp=0,flag=0;
 61         while(a[l]>='0'&&a[l]<='9'){
 62             tmp=tmp*10+a[l]-'0';
 63             l++;
 64             flag=1;
 65         }
 66         if(!flag&&a[l]=='a'){
 67             l++;tmp=231;flag=1;
 68         }
 69         if(!flag){
 70             if(a[l]=='(')s2[++now2]=a[l++];
 71             else if(a[l]==')'){
 72                 while(s2[now2]!='('){
 73                     int tmp1=work(s1[now-1],s2[now2],s1[now]);
 74                     now--;now2--;
 75                     s1[now]=tmp1;
 76                 }
 77                 now2--;l++;
 78             }
 79             else{
 80                 while(cmp(a[l],s2[now2])){
 81                     int tmp1=work(s1[now-1],s2[now2],s1[now]);
 82                     now--;now2--;
 83                     s1[now]=tmp1;
 84                 }
 85                 s2[++now2]=a[l++];
 86             }
 87         }
 88         else s1[++now]=tmp;
 89     }
 90     while(s2[now2]!='`'){
 91         int tmp1=work(s1[now-1],s2[now2],s1[now]);
 92         now--;now2--;
 93         s1[now]=tmp1;
 94     }
 95     ans1=s1[now]%mod;;
 96     n=read();
 97     for1(i,n){
 98         gets(a);
 99         lena=strlen(a);
100         tail=0;head=0;
101         while(tail<lena){
102             if(a[tail]!=' ')a[head++]=a[tail];
103             tail++;
104         }
105         lena=head;
106         l=0,now=0,now2=0;
107         s2[now2]='`';
108         while(l<lena){
109             int tmp=0,flag=0;
110             while(a[l]>='0'&&a[l]<='9'){
111                 tmp=tmp*10+a[l]-'0';
112                 l++;
113                 flag=1;
114             }
115             if(!flag&&a[l]=='a'){
116                 l++;tmp=231;flag=1;
117             }
118             if(!flag){
119                 if(a[l]=='(')s2[++now2]=a[l++];
120                 else if(a[l]==')'){
121                     while(s2[now2]!='('){
122                         int tmp1=work(s1[now-1],s2[now2],s1[now]);
123                         now--;now2--;
124                         s1[now]=tmp1;
125                     }
126                     now2--;l++;
127                 }
128                 else{
129                     while(cmp(a[l],s2[now2])){
130                         int tmp1=work(s1[now-1],s2[now2],s1[now]);
131                         now--;now2--;
132                         s1[now]=tmp1;
133                     }
134                     s2[++now2]=a[l++];
135                 }
136             }
137             else s1[++now]=tmp;
138         }
139         while(s2[now2]!='`'){
140             int tmp1=work(s1[now-1],s2[now2],s1[now]);
141             now--;now2--;
142             s1[now]=tmp1;
143         }
144         s1[now]%=mod;
145         if(s1[now]==ans1)
146             printf("%c",(char)('A'+i-1));
147     }
148     return 0;
149 }
150 //+ - > * / > ^
40分代码

 

posted @ 2017-07-27 16:38  HTWX  阅读(395)  评论(0编辑  收藏  举报