表达式求值。 手动模拟吧。可以用站维护,这里我没用到栈来写。注意不能gets() 输入有换行。 还要用到高精度,套一个模板。
#include<cstdio> #include<cstdio> #include<cmath> #include<queue> #include<stack> #include<string> #include<cstring> #include<iostream> #include<map> #include<vector> #include<algorithm> #include<set> #include<cmath> using namespace std; const int mmax = 510; const int inf = 0x3fffffff; struct Bignum { int Sz; int num[mmax]; void print() { for(int i=Sz-1;i>=0;i--) printf("%d",num[i]); puts(""); } Bignum() { memset(num,0,sizeof num); } Bignum(int sz,char *a) { memset(num,0,sizeof num); for(int i=0;i<sz;i++) { num[i]=a[sz-1-i]-'0'; } Sz=1; for(int i=sz-1;i>=0;i--) { if(num[i]) { Sz=i+1; break; } } } Bignum(int sz,int *a) { memset(num,0,sizeof num); for(int i=0;i<sz;i++) num[i]=a[i]; Sz=sz; } Bignum(int x) { memset(num,0,sizeof num); if(x==0) Sz=1; Sz=0; while(x) { num[Sz++]=x%10; x/=10; } } Bignum operator + (const Bignum &a) { int tmp[mmax]; memset(tmp,0,sizeof tmp); int len=max(Sz,a.Sz); for(int i=0;i<len;i++) { tmp[i]+=num[i]+a.num[i]; tmp[i+1]+=tmp[i]/10; tmp[i]%=10; } return Bignum(len+(tmp[len]?1:0),tmp); } Bignum operator - (const Bignum &a) { int tmp[mmax]; memset(tmp,0,sizeof tmp); int len=max(Sz,a.Sz); for(int i=0;i<len;i++) { tmp[i]+=num[i]-a.num[i]; if(tmp[i]<0) { tmp[i+1]-=1; tmp[i]+=10; } } for(int i=len-1;i>=0;i--) { if(tmp[i]) return Bignum(i+1,tmp); } return Bignum(1,tmp); } Bignum operator * (const Bignum &a) { int tmp[mmax]; memset(tmp,0,sizeof tmp); for(int i=0;i<Sz;i++) for(int j=0;j<a.Sz;j++) { tmp[i+j]+=num[i]*a.num[j]; } for(int i=0;i<Sz+a.Sz;i++) { tmp[i+1]+=tmp[i]/10; tmp[i]%=10; } for(int i=Sz+a.Sz-1;i>=0;i--) { if(tmp[i]) return Bignum(i+1,tmp); } return Bignum(1,tmp); } bool operator <(const Bignum &a) const { for(int i=mmax-1;i>=0;i--) { if(num[i]>a.num[i]) return 0; if(num[i]<a.num[i]) return 1; } return 0; } bool operator ==(const Bignum &a) const { for(int i=mmax-1;i>=0;i--) { if(num[i]!=a.num[i]) return 0; } return 1; } }; char str[mmax]; char S[mmax]; int getnum(int x) { int num=0; if(str[x]=='*' || str[x]=='+' ) return -1; while(x<strlen(str) && str[x]!='*' && str[x]!='+') { num=num*10+str[x]-'0'; x++; } return num; } int main() { int n,ca=0; while(~scanf("%d",&n)) { if(n==0) { printf("Case %d: Invalid Expression!\n",++ca); continue; } int len=0; // memset(str,0,sizeof str); // for(int i=0;i<n;i++) // { // scanf("%s",S); // for(int j=0;j<strlen(S);j++) // { // if(S[j]!=' ') // str[len++]=S[j]; // } // } Bignum ans(0); bool fg=1; // if(str[len-1]=='+' || str[len-1]=='*') // { // printf("Case %d: Invalid Expression!\n",++ca); // continue; // } int j=0; // Bignum tmp(1); // while(j<strlen(str)) // { // int x=getnum(j); // if(x==-1) // { // fg=0; // break; // } // Bignum xx(x); // tmp=tmp*xx; // if(j==len || str[j]=='+') // { // ans=ans+tmp; // tmp=Bignum(1); // } // j++; // } int cnt=0; Bignum tmp(1); while(cnt<n) { scanf("%s",str); cnt++; int x=getnum(0); if(x==-1) fg=0; if(x!=-1) { Bignum xx(x); tmp=tmp*xx; } if(cnt==n) ans=ans+tmp; if(cnt<n) { scanf("%s",str); cnt++; if(cnt==n) fg=0; if(str[0]!='+' && str[0]!='*') fg=0; if(str[0]=='+') { ans=ans+tmp; tmp=Bignum(1); } } } if(!fg) { printf("Case %d: Invalid Expression!\n",++ca); continue; } printf("Case %d: ",++ca); ans.print(); } return 0; }
原文地址:http://blog.csdn.net/u012127882/article/details/46582327