设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1 5 20 -4 4 -5 2 9 1 -2 0
#include <stdio.h> #include <stdlib.h> typedef struct Node //定义单链表结构存储多项式 { int xishu; int zhishu; struct Node *next; }Node,*List; List input(List L,int num); //读取数据 List multi(List L1,List L2); //两个多项式相乘 List add(List L1,List L2); //两个多项式相加 void print(List L); //输出多项式 int main() { int num1,num2; //两个多项式的项数 List L1,L2,L; //L1为第一个输入的多项式,L2为第二个输入的多项式,L为相加或相乘的结果 scanf("%d",&num1); L1=input(L1,num1); scanf("%d",&num2); L2=input(L2,num2); L=multi(L1,L2); print(L); printf("\n"); L=add(L1,L2); print(L); return 0; } List input(List L,int num) { int i; Node*p,*s; L=(Node*)malloc(sizeof(Node)); //建立头结点 L->next=NULL; p=L; for (i=0;i<num;i++) //读入数据 { s=(Node*)malloc(sizeof(Node)); scanf("%d%d",&s->xishu,&s->zhishu); p->next=s; p=s; } p->next=NULL; return L; } List add(List L1,List L2) { List L; Node*p,*s,*r,*Lp; p=L1->next; s=L2->next; L=(Node*)malloc(sizeof(Node)); //建立头结点 L->next=NULL; r=L; while (p && s) { Lp=(Node*)malloc(sizeof(Node)); if (p->zhishu>s->zhishu) { Lp->zhishu=p->zhishu; Lp->xishu=p->xishu; p=p->next; }else if (p->zhishu<s->zhishu) { Lp->zhishu=s->zhishu; Lp->xishu=s->xishu; s=s->next; }else { Lp->zhishu=p->zhishu; Lp->xishu=p->xishu+s->xishu; p=p->next; s=s->next; if (Lp->xishu==0) continue; //如果系数相加等于0,则舍弃该项 } r->next=Lp; r=Lp; } r->next=p?p:s; return L; } List multi(List L1,List L2) { List L,Lsum; Node*p,*s,*r,*Lp; p=L1->next; s=L2->next; Lsum=(Node*)malloc(sizeof(Node)); //建立头结点 Lsum->next=NULL; while (p) { L=(Node*)malloc(sizeof(Node)); L->next=NULL; r=L; while(s) //依次乘以第二个多项式的每一项 { Lp=(Node*)malloc(sizeof(Node)); Lp->xishu=(p->xishu)*(s->xishu); Lp->zhishu=(p->zhishu)+(s->zhishu); s=s->next; r->next=Lp; r=Lp; } r->next=NULL; Lsum=add(Lsum,L); //将每次相乘得出的多项式累加 free(L); s=L2->next; //又从第二个多项式的头开始依次相称 p=p->next; //以第一个多项式的下一项为相乘因子 } return Lsum; } void print(List L) { Node*p; p=L->next; if (!p) //如果为零多项式,则打印 0 0 {printf("0 0");return;} printf("%d %d",p->xishu,p->zhishu); p=p->next; while (p) { printf(" %d %d",p->xishu,p->zhishu); p=p->next; } }