1002*This brave man is super strong but super cautious!
字符串模拟求n阶导数,比较恶心 题目传送门
思路:
1.输入字符串,预处理每一项,用类似于快读的方法分别拆出来系数和x的幂数,把系数存入以x的幂数为下标的数组。
2.求n次导,就是每次从x0到x10,按数学方法算一下。
3.输出,如果xk的系数不为0,就输出。但要考虑第一项和非第一项,非第一项的正数前面要加+ ,如果所有系数都是0的话,输出为0
(系数的数据范围是int,求导后可能会爆,所以要用longlong存系数)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int m,n,flag;
ll x_[11]; //x_[i]存的是x^i的系数
char s[110];
void print(int x,ll num){
if(!flag){//第一项
if(num>0);
if(num<0)printf("-");
num=num<0?-num:num;
if(num!=1||x==0)printf("%lld",num);
flag=1;
if(x!=0){
printf("x");
if(x>1)printf("^%d",x);
}
}else{//非第一项
if(num>0)printf("+");
if(num<0)printf("-");
num=num<0?-num:num;
if(num!=1||x==0)printf("%lld",num);
if(x!=0){
printf("x");
if(x>1)printf("^%d",x);
}
}
}
int main(){
//1 0 x^10-3x^9+7x^6-5x^5-2147483737x^4-x^3-x^2+x-12131312321
//freopen("now.in","r",stdin);
cin>>m;
while(m--){
scanf("%d%s",&n,s);
int i=0;
for(int j=0;j<=10;j++)x_[j]=0; //x_[j]存的是x^j的系数
while(i<strlen(s)){
int x=0,f=0,sgn=1; //预处理每项的系数
ll num=0;
if(s[i]=='-')sgn=-1,i++;
if(s[i]=='+')i++;
while(s[i]>='0'&&s[i]<='9'&&i<strlen(s)){ //类似于快读
num=(num<<1)+(num<<3)+(s[i]^48);
f=1;
i++;
}
if(s[i]=='x'&&i<strlen(s))
if(s[i+1]=='^'){
x=s[i+2]-'0';
if(s[i+3]=='0')x+=9,i+=4;
else i+=3;
}else x=1,i+=1;
if(x>0&&num==0)num=1;
x_[x]+=num*sgn;
} //预处理到这里结束
for(int j=1;j<=n;j++){ //求n次导
x_[0]=0;
for(int k=1;k<=10;k++){
x_[k-1]+=x_[k]*k;
x_[k]=0;
}
}
//输出
flag=0;
for(int j=10;j>=0;j--)
if(x_[j]!=0)print(j,x_[j]);
if(!flag)printf("0");
printf("\n");
}
//fclose(stdin);
}