02-线性结构2. 一元多项式求导 (25)


时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard

设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)

输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。

输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0
 
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard

设计函数求一元多项式的导数。(注:xn(n为整数)的一阶导数为n*xn-1。)

输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。

输入样例:
3 4 -5 2 6 1 -2 0
输出样例:
12 3 -10 1 6 0

下面是我写的代码,直接用了打表的方法:

#include<stdio.h>
#define MAXSIZE 1000

int differentiateA(int index[],int maxindex);
int differentiateB(int index[],int maxindex);
void print(int indexA[],int maxindexA,int indexB[],int maxindexB);

int main()
{
	int indexA[MAXSIZE]={0},indexB[MAXSIZE]={0};	//用两个数组,分别表达正指数项和负指数项 
	int maxindexA=0,maxindexB=0;
	int i=0,A;
	char quit=0;			 
	
	scanf("%d %d%c",&A,&i,&quit);		//因为不确定输出个数,所以用该格式确认输入完毕 
	if(i>=0){							//对用来记录最大幂次的特殊点——第一个数据,进行单独处理 
		indexA[i]=A;
		maxindexA=i;
	}
	else{
		indexB[-i]=A;<span style="white-space:pre">			</span>//对于负指数数组,取下标的时候要记住加负号!
		maxindexB=-i;
	}
	
	while(i>-1&&quit!='\n'){			//正指数输入循环 
		scanf("%d %d%c",&A,&i,&quit);
		if(i>=0){
			indexA[i]=A;
		}
		else{							//若有负指数,第一次出现时会进入正指数的输入循环,应当单独处理 
			indexB[-i]=A;
			maxindexB=-i;
		}
	}
	while(i<0&&quit!='\n'){				//负指数输入循环 
		scanf("%d %d%c",&A,&i,&quit);
		indexB[-i]=A;
		maxindexB=-i;
	}
	
	
	maxindexA=differentiateA(indexA,maxindexA);		//对于正指数和负指数,应该使用不同的求导方式; 
	maxindexB=differentiateB(indexB,maxindexB);
	print(indexA,maxindexA,indexB,maxindexB);
	
	return 0;
}

int differentiateA(int index[],int maxindex)		//正指数项,从数组的小下标开始运算 
{
	int i=0;
	index[i]=0;
	for(i=1;i<=maxindex;++i){
		index[i-1]=index[i]*i;
		index[i]=0;
	}
	if(maxindex>0) maxindex-=1;
	return maxindex;
}

int differentiateB(int index[],int maxindex)		//负指数项,从数组的大下标 开始运算。(实质上也是从高次幂开始 ) 
{
	int i;
	for(i=maxindex;i>0;--i){
		index[i+1]=index[i]*(-i);
		index[i]=0;
	}
	if(maxindex>0) maxindex+=1;
	return maxindex;
}

void print(int indexA[],int maxindexA,int indexB[],int maxindexB)
{
	if(maxindexA==0){								//首先打印正指数项,其中有两个特殊情况 
		printf("%d %d",indexA[0],maxindexA);
	}
	else if(maxindexA==1){
		printf("%d %d %d %d",indexA[maxindexA],maxindexA,indexA[maxindexA-1],maxindexA-1);
	}
	else{											
		int i=maxindexA;
		printf("%d %d",indexA[i],i);
		--i;
		for(i;i>=0;--i){
			if(indexA[i]!=0){
				printf(" %d %d",indexA[i],i);		//这里要注意,存在非常数项的时候,不输出0 0 
			};
		};
	}
	
	if(maxindexB==1){								//负指数项输出,也是取用数组下标的方式改了一下而已 
		printf(" %d %d",indexB[maxindexB],-maxindexB);
	}
	else if(maxindexB>1){
		int i;
		for(i=1;i<=maxindexB;++i){
			if(indexB[i]!=0){
				printf(" %d %d",indexB[i],-i);
			}
		}
	}
}

几个特殊点:

1.只有常数项

2.最高次为1

3.最高次为2

4.只有常数项和负指数项

5.只有正指数项

5.零

6.纯负指数

 
  
 
  
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值