注意有空格。
裸的表达式计算
#include<cstdio> #include<cmath> #include<cstring> using namespace std; #define N 256 int num[N],p=1,i,z; char symbol[N],s[N],t[N],ans[N]; inline void push(){ symbol[++p]=s[i]; } inline void pop(){ switch(symbol[p--]){ case '^':num[p]=pow(num[p],num[p+1]);break; case '+':num[p]+=num[p+1];break; case '-':num[p]-=num[p+1];break; case '*':num[p]*=num[p+1];break; case '/':num[p]/=num[p+1];break; } } inline bool can(){ if((s[i]=='+'||s[i]=='-')&&symbol[p]!='(') return 1; if(s[i]=='^'&&symbol[p]=='^') return 1; if((s[i]=='*'||s[i]=='/')&&(symbol[p]=='*'||symbol[p]=='/')) return 1; return 0; } inline void deal(){ gets(s); int len=strlen(s); s[len]=')';symbol[p]='('; while(i<len){ while(s[i]=='(') push(),i++; int x(0); while(s[i]>='0'&&s[i]<='9') x=x*10+s[i++]-'0'; num[p]=x; do{ if(s[i]==')'){ while(symbol[p]!='(') pop(); num[--p]=num[p+1]; } else{ while(can()) pop(); push(); } i++; }while(i<len&&s[i-1]==')'); } } int main(){ deal(); printf("%d\n",num[0]); return 0; }
本题AC代码:
#include<cstdio> #include<cstring> using namespace std; #define ll long long const int N=10003; const int a=10007; const int p=100007; char s[N],c[N],sym[N]; int m,num[N],yxj[N],topnum,topch; int get(char ch){ if(ch=='+'||ch=='-') return 1; if(ch=='*') return 2; if(ch=='^') return 3; } int ipow(int a,int b){ ll t=1; for(int i=1;i<=b;i++) t=t*a%p; return (int)t; } int cal(char ch,int a,int b){ switch(ch){ case '^':return ipow(a,b);break; case '+':return (a+b)%p;break; case '-':return (a-b+p)%p;break; case '*':return (int)(1ll*a*b%p);break; } } bool can(char ch){ return (ch=='+'||ch=='-'||ch=='*'||ch=='^'||ch=='('||ch==')'); } int deal() { int len=strlen(s),tmp=0,j=100,k; c[0]=' '; for(int i=0;i<len;++i) if(s[i]!=' ') c[++tmp]=s[i]; c[tmp+1]=' '; len=tmp;tmp=1;topnum=topch=0; while(tmp<=len) { if(can(c[tmp])){ if(c[tmp]=='(') j+=10; else if(c[tmp]==')') j-=10; else{ k=get(c[tmp]); while(topch&&yxj[topch]>=k+j) { num[topnum-1]=cal(sym[topch],num[topnum-1],num[topnum]); --topnum;--topch; } sym[++topch]=c[tmp];yxj[topch]=k+j; } ++tmp; } else{ if(c[tmp]=='a') num[++topnum]=a,++tmp; else{ k=0; for(;c[tmp]>='0' && c[tmp]<='9' && tmp<=len;++tmp)k=k * 10+c[tmp]-'0'; num[++topnum]=k; } } } while(topch){ num[topnum-1]=cal(sym[topch],num[topnum-1],num[topnum]); --topnum;--topch; } return num[1]; } int main() { gets(s); int res=deal(); scanf("%d\n",&m); for(int i=1;i<=m;++i){ gets(s); int now=deal(); if(now==res) putchar(64+i); } puts(""); return 0; }