传送门
- 最高次项和其他项的区别(如果为-0则需要抹掉-)
- 最高次项正负的差别(若为负数,solve()的调用条件与其他项相同;正数则需要特别处理)
- 求导结束后是否还有指数(1 0的幂次不作处理)
- _x, _, _ x ^ _, x ^ _(基本四种之外,还有前面带了+ -的八种)
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
#define MAXN 10000
int n,
ans,
sum,
ttcnt;
string origin,
Derivative,
valuein,
vplus,
anscon;
int s2i(string a){
int len = a.length(), val = 0, tencnt = pow(10.0, len-1);
for(int i = 0;i < len;i++){
val += a[i]*tencnt;
tencnt /= 10;
}
return val;
}
string i2s(int a){
string val;
int tempa = 0;
if(a == 0){
return "0";
}
if(a < 0) tempa = 1;
while(a){
val += a%10+'0';
a /= 10;
}
if(tempa) val += '-';
reverse(val.begin(), val.end());
return val;
}
bool specheck(string a){
if(a[0] == '-'){
if(a.length() == 3){
cout << "POLYNOMIAL " << ttcnt << endl;
sum -= (a[1]-'0');
cout << a << endl << a[0] << a[1] << endl << a[0] << a[1] << endl << a[0] << a[1] << endl << sum << endl;
return 1;
}
else if(a.length() == 2){
cout << "POLYNOMIAL " << ttcnt << endl;
if(a[1] == 'x') cout << a << endl << -1 << endl << -1 << endl << -1 << endl << -1 << endl;
cout << a << endl << '0' << endl << '0' << endl << '0' << endl << 0 << endl;
return 1;
}
}
else{
if(a.length() == 1){
cout << "POLYNOMIAL " << ttcnt << endl;
if(a[0] == 'x') cout << a << endl << 1 << endl << 1 << endl << 1 << endl << 1 << endl;
else cout << a << endl << '0' << endl << '0' << endl << '0' << endl << 0 << endl;
return 1;
}
else if(a.length() == 2){
cout << "POLYNOMIAL " << ttcnt << endl;
sum = (a[0]-'0');
cout << a << endl << a[0] << endl << a[0] << endl << a[0] << endl << sum << endl;
return 1;
}
}
}
void solve(string a, int check){
int xishu, zhishu, commona;
string xishucon, zhishucon;
if((a[0] >= '0' && a[0] <= '9')||a[0] == 'x') {
xishu = (a[0]>='0' && a[0] <= '9')? a[0]-'0' : 1;
if(a[2] == '^' || a[1] == '^'){
if(a[2] == '^') zhishu = a[3] - '0';
else zhishu = a[2] - '0';
xishu *= zhishu, zhishu -= 1, xishucon = i2s(xishu), zhishucon = i2s(zhishu);
if(zhishu > 1){
Derivative += xishucon + "x^" + zhishucon;
valuein += xishucon + "(" + anscon + ")^" + zhishucon;
commona = xishu*pow(double(ans), zhishu);
vplus += i2s(commona);
sum += commona;
}
else{
Derivative += xishucon + 'x';
valuein += xishucon + "(" + anscon + ")";
commona = xishu*ans;
vplus += i2s(commona);
sum += commona;
}
}
else if(a[1] == 'x'){
Derivative += a[0];
valuein += a[0];
commona = xishu*ans;
vplus += i2s(commona);
sum += commona;
}
else{
Derivative += '0';
valuein += '0';
vplus += '0';
}
}
else{
char sym = a[0];
int symc = (a[0] == '-')?1:0, temp = 0, commona;
xishu = (a[1]>='0' && a[1] <= '9')? a[1]-'0' : 1;
if(xishu > 1 && a[3] == '^'){
zhishu = a[4] - '0', xishu *= zhishu, zhishu -= 1;
xishucon = i2s(xishu), zhishucon = i2s(zhishu);
if(zhishu > 1){
Derivative += sym + xishucon + "x^" + zhishucon;
valuein += sym + xishucon + "(" + anscon + ")^" + zhishucon;
commona = xishu*pow(double(ans), zhishu);
if(!check && commona == 0) vplus += '0';
else vplus += sym + i2s(commona);
temp = commona;
sum += (symc==1?(temp*(-1)):temp);
}
else{
Derivative += sym + xishucon + 'x';
valuein += sym + xishucon + "(" + anscon + ")";
commona = xishu*ans;
if(!check && commona == 0) vplus += '0';
else vplus += sym + i2s(commona);
temp = commona;
sum += (symc==1?(temp*(-1)):temp);
}
}
else if(xishu == 1 && a[2] == '^'){
zhishu = a[3] - '0', xishu *= zhishu, zhishu -= 1;
xishucon = i2s(xishu), zhishucon = i2s(zhishu);
if(zhishu > 1){
Derivative += sym;
Derivative += xishucon;
Derivative += "x^" + zhishucon;
valuein += sym;
valuein += xishucon;
valuein += "(" + anscon + ")^";
valuein += zhishucon;
commona = xishu*pow(double(ans), zhishu);
if(!check && commona == 0) vplus += '0';
else vplus += sym + i2s(commona);
temp = commona;
sum += (symc==1?(temp*(-1)):temp);
}
else{
Derivative += sym;
Derivative += xishucon;
Derivative += 'x';
valuein += sym;
valuein += xishucon;
valuein += "(" + anscon + ")";
commona = xishu*ans;
if(!check && commona == 0) vplus += '0';
else vplus += sym + i2s(commona);
temp = commona;
sum += (symc==1?(temp*(-1)):temp);
}
}
else if(a[2] == 'x'){
Derivative += sym;
Derivative += a[1];
valuein += sym;
valuein += a[1];
commona = xishu;
if(!check && commona == 0) vplus += '0';
else vplus += sym + i2s(commona);
temp = commona;
sum += (symc==1?(temp*(-1)):temp);
}
else if(a[1] == 'x'){
xishu = 1;
Derivative += sym;
Derivative += '1';
valuein += sym;
valuein += '1';
if(!check && commona == 0) vplus += '0';
else vplus += sym + i2s(commona);
sum += symc==1?-1:1;
}
else{
return;
}
}
}
int main() {
scanf("%d", &n);
for(ttcnt = 1; ttcnt <= n; ttcnt++){
cin >> ans >> origin;
string con;
anscon = i2s(ans), Derivative.clear(),valuein.clear(),vplus.clear(), sum = 0;
if(specheck(origin)) continue;
int checkcc = 0;
for(int iter = 0;iter < origin.length();iter++){
if((origin[iter] == '+' || origin[iter] == '-') && iter!=0){
solve(con, checkcc);
con.clear();
con += origin[iter];
checkcc++;
}
else{
con += origin[iter];
}
}
if(!checkcc){
solve(con,checkcc);
}
cout << "POLYNOMIAL " << ttcnt << endl;
cout << origin << endl << Derivative << endl << valuein << endl << vplus << endl << sum << endl;
}
return 0;
}