此题有很多点,比较麻烦,主要是自己确实想的比较简单,不过最终通过各种限制还是做出来了。
描述
据说每一个搞ACM的上辈子都是脑细胞死光钻到牛角尖里出不来的天使哦,可ACMer也会经常遇到些很简单的难题,比如a+b,找数列最大值……bluestone最近就遇到了这样的简单难题,Professor给她出了道一元多项式运算的题,但是bluestone做了一天没能做出来,于是她前来请教在座聪明的各位,看谁最先能帮bluestone解决这个problem??她会灰常感激的哦~
bluestone给大家提个醒:类似以下式子的称为一元多项式:
f(x)=ax^n+bx^m+……+k
如果给出x的值,我们马上就能算出f(x)了吧~
输入
输入第一行,是一个整数T(0<T<=100),表示一共有T组测试数据,以下紧跟T组测试数据,每组第一行是一个X(0<=X<=10000),表示X的值;第二行是一个一元多项式,多项式的长度不会超过100。只进行多项式加减运算,保证最后运算的结果始终在int范围内,输入格式请参见样例。
输出
每组测试数据输出占一行,输出最后的结果,具体格式请严格参考样例(注意空格)
样例输入1 复制
2
2
2X^2+3X+1
3
X+1
样例输出1
Case #1:15
Case #2:4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include<iostream> #include<cstdio> #include<string> #include<algorithm> using namespace std; string s; int deal(int x,int start,int end) { if(start>end)//处理特殊情况,处理+或-号在多项式最前端或最后端 return 0; int s1=1; //处理前面系数乘数,如果为省略1时则为1 int i=start; if(s[start]!='X') {s1=s[start]-'0'; //如果不省略,记下大小 for(i=start+1;i<=end&&s[i]!='X';i++) { s1=s1*10+s[i]-'0'; }} int s2; if(s[i]=='X'||s[start]=='X') //处理含有X的项时候默认为乘方1 s2=1; else s2=0; //不含有X,那X乘方为0 if((i+2)<=end) //处理乘方数 s2=s[i+2]-'0'; for(int u=i+3;u<=end;u++) { s2=s2*10+s[u]-'0'; //乘方数大小 } int s3=1; //如果X不存在,默认为1。如果乘方为0,默认也为1 while(s2--) //如果X存在,进行相关乘方处理 { s3=s3*x; } if(s1==0) //特殊情况乘数为0 return 0; else return s1*s3; } int main() { int n; cin>>n; int NUM=1; for(int i=1;i<=n;i++) { s.clear(); int x; cin>>x; cin>>s; int start=0; int end=0; int sum=0; int flag=1; //进行第一个符号处理设的 ,+为1,-为0 for(int u=0;u<s.length();u++) { if(s[u]=='+'||s[u]=='-') // 遇到符号,对符号之前的式子处理 { end=u-1; //定位之前的end if(flag) //式子之前的符号 { sum+=deal(x,start,end); } else { sum-=deal(x,start,end); } start=u+1; if(s[u]=='+') //为下一个式子准备 flag=1; else flag=0; } } end=s.length()-1; //式子末尾特殊处理 if(flag) sum+=deal(x,start,end); else sum-=deal(x,start,end); printf("Case #%d:%d\n",NUM,sum); NUM++; } return 0; }
|