SDNU2019期末结训赛补题

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);
}
			
			
			
			
发布了17 篇原创文章 · 获赞 7 · 访问量 2080

猜你喜欢

转载自blog.csdn.net/qq_45530271/article/details/103599791