题目
设计函数求一元多项式的导数。(注: x n x^n xn( n n n为整数)的一阶导数为 n x n − 1 nx^{n−1} nxn−1 。)
输入格式
以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。
输出格式
以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0
,但是表示为0 0
。
输入样例
3 4 -5 2 6 1 -2 0
输出样例
12 3 -10 1 6 0
代码
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//多项式的单元
typedef struct polynomial{
int coefficient;
int index;
}polynomial;
//多项式
typedef struct list{
polynomial *list;
size_t length;
size_t size;
}list;
//多项式线性表初始化
void init(list *list){
list->list = (polynomial *) malloc(sizeof(polynomial)*10);
if(!list->list)
exit(-1);
list->size = 10;
list->length = 0;
}
//多项式线性表延长
void expand(list *list){
list->list = (polynomial *) realloc(list->list, sizeof(polynomial)*(list->size+10));
if(!list->list)
exit(-1);
list->size += 10;
}
//添加多项式单元
void push(list *list, polynomial pol){
if(list->length == list->size-1)
expand(list);
list->list[list->length].coefficient = pol.coefficient;
list->list[list->length].index = pol.index;
list->length++;
}
//求导
void derivation(list *list){
for(int i = 0; i < list->length; i++){
if(list->list[i].index != 0){
list->list[i].coefficient *= list->list[i].index;
list->list[i].index--;
}else{
list->list[i].coefficient = 0;
}
}
}
int main(void){
polynomial pol;
list list;
init(&list);
while(scanf("%d %d",&pol.coefficient,&pol.index)!=EOF){
push(&list,pol);
}
derivation(&list);
//坑逼输出格式
if(list.length == 1){
printf("%d %d",list.list[0].coefficient,list.list[0].index);
}else{
for(int i=0; i < list.length; i++){
if(list.list[i].coefficient!=0){
if(i < list.length -1 && list.list[i+1].coefficient != 0){
printf("%d %d ",list.list[i].coefficient,list.list[i].index);
}else{
printf("%d %d",list.list[i].coefficient,list.list[i].index);
}
}
}
}
return 0;
}
小结
这题巨坑的地方就是其输出格式,如果多项式是常数的话应该输出0 0
,同时如果多项式不是常数的话,0 0
项目不应该输出,即输出非零系数多项式。