02-2. 一元多项式求导 (25)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
设计函数求一元多项式的导数。
输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。
输入样例:3 4 -5 2 6 1 -2 0输出样例:
12 3 -10 1 6 0
这个问题解起来本身并不难,但是有一个地方要注意,那就是当输入只有常数项时,例如4 0;此时输出应为0 0。下面这个程序是我写的,使用C语言,链表存储数据。(虽然既麻烦又啰嗦,但是成功通过了,我还是挺高兴的,后面的程序很简洁,使用的是数组存储的方式,来自于网络)
方法一:C语言+链表 来自网络,出处:点击链接
/** * C语言--链表实现:一元多项式的导数 * 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 * 输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是0,但是表示为“0 0”。 * 输入样例:3 4 -5 2 6 1 -2 0 输出样例:12 3 -10 1 6 0 */ #include <stdio.h> #include <stdlib.h> #define MAX 1000 typedef struct Polynomial{ int data[MAX + 1]; int highPower; }*Poly; void ZeroPoly(Poly poly) { //将所有系数置0 for(int i = 0; i < MAX; i++) poly->data[i] = 0; poly->highPower = 0; } void InitPoly(Poly poly) { //根据输入格式设计的初始化多项式函数 int coef, exp; scanf("%d%d", &coef, &exp); poly->data[exp] = coef; poly->highPower = exp; while(scanf("%d%d", &coef, &exp) != EOF){ poly->data[exp] = coef; } } void DerivPoly(Poly poly, Poly retPoly) { //求导 if(poly->highPower) retPoly->highPower = poly->highPower - 1; for(int i = 1; i <= poly->highPower; i++) if(poly->data[i]) { retPoly->data[i - 1] = i * poly->data[i]; } } void Print(Poly poly) { if(poly->highPower == 0 && poly->data[0] == 0) printf("0 0"); for(int i = poly->highPower; i >= 0; i--) { if(poly->data[i]) { if(i != poly->highPower) printf(" "); printf("%d %d", poly->data[i], i); } } } int main() { Poly poly = (Poly)malloc(sizeof(struct Polynomial)); ZeroPoly(poly); InitPoly(poly); //读入数据 Poly retPoly = (Poly)malloc(sizeof(struct Polynomial)); ZeroPoly(retPoly); DerivPoly(poly, retPoly); //求导 Print(retPoly); //输出结果 free(poly); free(retPoly); return 0; }
方法二:C语言+数组:来自于网络,出处:点击打开链接
#include <stdio.h> int getnum(int a[],int b[]); void putnum(int a[],int b[],int n); int main() { int degree,co[20],index[20],result_co[20],result_index[20]; int i; for(i=0;i<20;i++) co[i]=index[i]=result_index[i]=result_co[i]=0; degree=getnum(co,index); if(degree>1) for(i=0;i<degree;i++) { result_co[i]=co[i]*index[i]; result_index[i]=index[i]-1; } else result_co[0]=result_index[0]=0; putnum(result_co,result_index,degree); return 0; } int getnum(int a[],int b[]) { int i; i=0; do{ scanf("%d%d",&a[i],&b[i]); i++; }while(b[i-1]!=0); return i; } void putnum(int a[],int b[],int n) { int i; if(n>1) { n=n-1; for(i=0;i<n-1;i++) printf("%d %d ",a[i],b[i]); printf("%d %d",a[n-1],b[n-1]); } else printf("%d %d",a[0],b[0]); }