时间限制
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.纯负指数