题目描述
给你两个一元多项式,输出这两个一元多项式的乘积。
输入格式
输入包含两行,每行一个一元多项式。
每行开头一个数字n,表示该多项式非零项项数,后面有n组数字,每组数字包含两个数字,按顺序分别为该项的系数和指数。
输出格式
输出包含一行,按指数从大到小的顺序输出乘积的非0项的系数与指数,以空格分隔开。
如果最终结果为0,直接输出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
代码展示
关键在于把两个一元多项式相乘分解为单项式乘多项式再相加
#include<iostream>
#include<cstdio>
using namespace std;
struct Node{
int coef;
int expon;
Node *next;
};
typedef Node* List;
int InitList(List& list){
list=new Node;
list->next=NULL;
return 0;
}
int DestroyList(List& list){
List p1,p2;
p1=list;
p2=list;
while(p1!=NULL){
p1=p1->next;
free(p2);
p2=p1;
}
return 0;
}
int AddNode(List& list,int c,int e){
List head=list;
List p1=list;
List p2=new Node;
p2->coef=c;
p2->expon=e;
p2->next=NULL;
if(head->next==NULL){
head->next=p2;
}
else{
while(p1->next!=NULL){
p1=p1->next;
}
p1->next=p2;
}
return 0;
}
List MergeList(List &listA,List &listB){//排序
List listC;
InitList(listC);
List p1=listA->next,p2=listB->next;
List p3=listC;
while(p1!=NULL&&p2!=NULL){
if(p1->expon > p2->expon){
List p=new Node;
p->coef=p1->coef;
p->expon=p1->expon;
p->next=NULL;
p3->next=p;
p3=p3->next;
p1=p1->next;
}
else if(p1->expon < p2->expon){
List p=new Node;
p->coef=p2->coef;
p->expon=p2->expon;
p->next=NULL;
p3->next=p;
p3=p3->next;
p2=p2->next;
}
else{
List p=new Node;
p->coef=p1->coef+p2->coef;
p->expon=p1->expon;
p->next=NULL;
p3->next=p;
p3=p3->next;
p1=p1->next;
p2=p2->next;
}
}
if(p1==NULL){
for(;p2!=NULL;p2=p2->next){
List p=new Node;
p->coef=p2->coef;
p->expon=p2->expon;
p->next=NULL;
p3->next=p;
p3=p3->next;
}
}
else if(p2==NULL){
for(;p1!=NULL;p1=p1->next){
List p=new Node;
p->coef=p1->coef;
p->expon=p1->expon;
p->next=NULL;
p3->next=p;
p3=p3->next;
}
}
return listC;
}
List SmallPolyMulti(List &list,int c,int e){
List slist;
InitList(slist);
List p1=list->next;
while(p1!=NULL){
AddNode(slist,p1->coef*c,p1->expon+e);
p1=p1->next;
}
return slist;
}
List PolyMulti(List &listA,List &listB){
List p1=listA->next;
List SumList;
List sl;
InitList(SumList);
while(p1!=NULL){
sl=SmallPolyMulti(listB,p1->coef,p1->expon);
SumList=MergeList(SumList,sl);
p1=p1->next;
}
return SumList;
}
void PrintList(const List& list){
List p=list;
int flag=0;
while(p->next!=NULL){
p=p->next;
if(p->coef){
cout<<p->coef<<' '<<p->expon<<' ';
flag=1;
}
else continue;
}
if(!flag) cout<<"0 0";
cout<<endl;
}
int main(){
int m;
cin>>m;
List listA,listB;
InitList(listA);
InitList(listB);
int c,e;
for(int i=0;i<m;i++){
cin>>c>>e;
AddNode(listA,c,e);
}
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>c>>e;
AddNode(listB,c,e);
}//将两个一元多项式的系数与指数存入链表
List SumList;
InitList(SumList);
SumList=PolyMulti(listA,listB);
PrintList(SumList);
DestroyList(listA);
DestroyList(listB);
return 0;
}