访问次数:

多项式运算(北林oj) | Wenji's blog
头部背景图片
WenJi's blog |
WenJi's blog |

多项式运算(北林oj)

此题有很多点,比较麻烦,主要是自己确实想的比较简单,不过最终通过各种限制还是做出来了。
描述
据说每一个搞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;
}