PAT 02-2. 一元多项式求导 (25)

来源:互联网 发布:ppt怎么做数据图 编辑:程序博客网 时间:2024/06/05 09:45

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 1000typedef 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;}elseresult_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]);}elseprintf("%d %d",a[0],b[0]);}


0 0
原创粉丝点击