题目描述
一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表。请编写程序对输入的两个一元多项式求积,并输出求积的结果。
输入格式
输入为两个一元多项式,每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束。 系数和指数均为整数,指数不小于0。
输出格式
输出为求积结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行。 系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0。
输入样例 复制
2 5 1 0 -1 -1
5 4 3 0 -1 -1
输出样例 复制
10 9 6 5 5 4 3 0
数据范围与提示
数据范围:每个多项式的数据项数量不超过10000
分类标签
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef
struct
Node{
int
x;
int
z;
struct
Node *next;
}*List;
void
attach(
int
x,
int
z,List *r);
List input();
List getmul(List p1,List p2);
void
output(List p);
int
main(){
List p1,p2,mul;
p1=input();
p2=input();
mul=getmul(p1,p2);
output(mul);
printf
(
"\n"
);
}
List input(){
int
x,z;
List r,p,temp;
p=(
struct
Node*)
malloc
(
sizeof
(
struct
Node));
r=p;
while
(
scanf
(
"%d%d"
,&x,&z)!=EOF){
if
(x==-1 && z==-1)
break
;
else
{
if
(x!=0) attach(x,z,&r);
}
}
temp=p;
p=p->next;
free
(temp);
return
p;
}
void
attach(
int
x,
int
z,List *r){
List p;
p=(
struct
Node*)
malloc
(
sizeof
(
struct
Node));
p->x=x;
p->z=z;
p->next=NULL;
(*r)->next=p;
(*r)=p;
}
List getmul(List p1,List p2){
if
(!p1||!p2)
return
NULL;
List r,p,temp,t1,t2;
int
x,z;
p=(
struct
Node*)
malloc
(
sizeof
(
struct
Node));
p->next=NULL;
r=p;
t1=p1;
t2=p2;
while
(t2){
attach(t1->x*t2->x,t1->z+t2->z,&r);
t2=t2->next;
}
t1=t1->next;
while
(t1){
t2=p2;
r=p;
while
(t2){
x=t1->x*t2->x;
z=t1->z+t2->z;
while
(r->next && r->next->z>z){
r=r->next;
}
if
(r->next && r->next->z==z){
if
(r->next->x+x){
r->next->x+=x;
}
else
{
temp=r->next;
r->next=temp->next;
free
(temp);
}
}
else
{
temp=(
struct
Node*)
malloc
(
sizeof
(
struct
Node));
temp->x=x;
temp->z=z;
temp->next=r->next;
r->next=temp;
}
t2=t2->next;
}
t1=t1->next;
}
temp=p;
p=p->next;
free
(temp);
return
p;
}
void
output(List p){
int
flag=0;
if
(!p)
printf
(
"0"
);
while
(p){
if
(!flag){
flag=1;
}
else
{
printf
(
" "
);
}
printf
(
"%d %d"
,p->x,p->z);
p=p->next;
}
}