习题3.6 一元多项式的乘法与加法运算 (20 分)
输入格式:
输入分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 dxs
{
int xs;
int zs;
struct dxs *next;
} d;
d* create(int n)
{
d *p,*q,*front;
int i;
p=(d*)malloc(sizeof(d));
p->next=NULL;
front=p;
for(i=0; i<n; i++)
{
q=(d*)malloc(sizeof(d));
scanf("%d %d",&q->xs,&q->zs);
q->next=p->next;
p->next=q;
p=q;
}
return front;
}
d* add(d * a,d * b)
{
d *p,*q,*front;
p=(d*)malloc(sizeof(d));
p->next=NULL;
front=p;
a=a->next;
b=b->next;
while(a!=NULL&&b!=NULL)
{
if(a->zs==b->zs)
{
q=(d*)malloc(sizeof(d));
q->xs=a->xs+b->xs;
if(q->xs)
{
q->zs=a->zs;
a=a->next;
b=b->next;
q->next=p->next;
p->next=q;
p=q;
}
else
{
a=a->next;
b=b->next;
free(q);
}
}
else if(a->zs>b->zs)
{
q=(d*)malloc(sizeof(d));
q->zs=a->zs;
q->xs=a->xs;
a=a->next;
q->next=p->next;
p->next=q;
p=q;
}
else
{
q=(d*)malloc(sizeof(d));
q->zs=b->zs;
q->xs=b->xs;
b=b->next;
q->next=p->next;
p->next=q;
p=q;
}
}
if(a!=NULL)
{
while(a!=NULL)
{
q=(d*)malloc(sizeof(d));
q->zs=a->zs;
q->xs=a->xs;
a=a->next;
q->next=p->next;
p->next=q;
p=q;
}
}
if(b!=NULL)
{
q=(d*)malloc(sizeof(d));
q->zs=b->zs;
q->xs=b->xs;
b=b->next;
q->next=p->next;
p->next=q;
p=q;
}
return front;
}
d* multiplies(d * a,d * b)
{
d *p,*q,*front,*B;
p=(d*)malloc(sizeof(d));
p->next=NULL;
front=p;
a=a->next;
b=b->next;
B=b;
while(a!=NULL)
{
q=(d*)malloc(sizeof(d));
q->xs=a->xs*b->xs;
q->zs=a->zs+b->zs;
b=b->next;
q->next=p->next;
p->next=q;
p=q;
if(b==NULL)
{
a=a->next;
b=B;
}
}
return front;
}
d* hb(d * a)
{
int temp1,temp2;
d *p,*q,*max;
for(p=a->next; p!=NULL; p=p->next)
{
max=p;
for(q=p->next; q!=NULL; q=q->next)
{
if(q->zs>max->zs)
{
max=q;
}
}
if(max!=p)
{
temp1=p->zs;
p->zs=max->zs;
max->zs=temp1;
temp2=p->xs;
p->xs=max->xs;
max->xs=temp2;
}
}
p=a->next;
max=p;
while(p->next!=NULL)
{
if(p->zs==p->next->zs)
{
p->xs=p->xs+p->next->xs;
if(p->xs!=0)
{
q=p->next;
p->next=p->next->next;
free(q);
}
else
{
q=max->next;
max->next=p->next->next;
free(q);
}
}
max=p;
p=p->next;
}
return a;
}
void print(d* p)
{
p=p->next;
if(p==NULL)
printf("0 0");
else
{
while(p!=NULL)
{
if(p->next!=NULL)
printf("%d %d ",p->xs,p->zs);
else
printf("%d %d",p->xs,p->zs);
p=p->next;
}
}
printf("\n");
}
int main()
{
int n1 ,n2;
d *front1,*front2,*front,*Front;
scanf("%d",&n1);
front1=create(n1);
scanf("%d",&n2);
front2=create(n2);
front=add(front1,front2);
if(n1==0||n2==0)
printf("0 0\n");
else
{
Front=multiplies(front1,front2);
print(hb(Front));
}
print(front);
return 0;
}
200多行是目前写过最长的了,这个题其实也没那么恐怖(我自己是刚刚学代码对是对了肯定还有很多值得改进的地方),主要是要会创建一个链表来存储多项式,然后要会遍历这个链表,删除一个结点,排序等对链表的基本操作掌握会该题应该就能解决。
最后如果部分正确可以看看哪些数据没过再去调整
图来自该博主https://blog.csdn.net/zl1085372438