7-2 一元多项式的乘法与加法运算 (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<iostream>
using namespace std;
struct LNode{
int a;//系数
int b;//指数
LNode*Next;
};
typedef struct LNode*List;
List CreateList()
{
int n,i,x,y;//x是系数,y是指数
cin>>n;
if(n==0)
return NULL;
List L,p,q;
L=new LNode;
L->Next=NULL;
p=L;
for(i=0;i<n;i++)
{
cin>>x>>y;
q=new LNode;
q->Next=NULL;
q->a=x;
q->b=y;
p->Next=q;
p=q;
}
return L;
}
void PrintList(List L)
{
List p;
if(L->Next==NULL)
{
cout<<"0 0";
}
else
{
p=L->Next;
while(p!=NULL)
{
if(p->Next==NULL)
cout<<p->a<<" "<<p->b;
else
cout<<p->a<<" "<<p->b<<" ";
p=p->Next;
}
}
}
List Add(List l1,List l2)
{
List l3=new LNode;
l3->Next =NULL;
if(!l1)
l3=l2;
else if(!l2)
l3=l1;
else if(!l1 && !l2 )
return NULL;
else{
List p=l1->Next ,q=l2->Next ,t=l3 ;
while(p&&q)
{
if(p->b >q->b )
{
t->Next =p;
t=p;
p=p->Next ;
}
else if(p->b <q->b)
{
t->Next =q;
t=q;
q=q->Next ;
}
else
{
t->Next =p;
t=p;
t->a =p->a +q->a ;
t->b =p->b ;
p=p->Next ;
q=q->Next ;
}
}
if(!p)
{
t->Next =q;
t=q;
}
else if(!q)
{
t->Next =p;
t=p;
}
}
return l3;
}
List Mult2(List t,List l2)
{
List l4=new LNode;
l4->Next =NULL;
List p,q,r;
p=l4;
for(r=l2->Next ;r!=NULL;r=r->Next )
{
q=new LNode;
q->Next =NULL;
q->a =r->a *t->a;
q->b =r->b +t->b;
p->Next =q;
p=q;
}
return l4;
}
List Mult1(List L1,List L2)
{
List temp=NULL,sum=NULL;
for(List p=L1->Next;p!=NULL;p=p->Next)
{
temp=Mult2(p,L2);
sum=Add(sum,temp);
}
return sum;
}
List Check(List L)
{
List p,t;
p=L;
while(p->Next!=NULL){
if(p->Next->a==0)
{
t=p->Next;
p->Next=t->Next;
delete t;
}
else
p=p->Next;//多次删除
}
return L;
}
int main()
{
List L1,L2,L3,L4;
L1=CreateList();
L2=CreateList();
if(!L1||!L2)
{
cout<<"0 0"<<endl;
}
else
{
L4=Mult1(L1,L2);
L4=Check(L4);
PrintList(L4);
cout<<endl;
}
L3=Add(L1,L2);
L3=Check(L3);
PrintList(L3);
return 0;
}
```cpp
在这里插入代码片
答案二:
在这里插入代码片
#include<iostream>
using namespace std;
struct Node{
int x,y;//系数,指数
Node *next;
};
typedef struct Node* List;
List CreateList()
{
List l=new Node;
l->next =NULL;
List p=l,q;
int k;
cin>>k;
if(k==0)
return NULL;
int a,b;
for(int i=0;i<k;i++)
{
cin>>a>>b;
q=new Node;
q->next =NULL;
q->x =a;
q->y =b;
p->next =q;
p=q;
}
return l;
}
List Merge(List l1,List l2)
{
List l3=new Node;
l3->next =NULL;
if(!l1)
return l2;
else if(!l2)
return l1;
else if(!l1 && !l2 )
return NULL;
else{
List p=l1->next ,q=l2->next ,t=l3 ;
while(p&&q)
{
if(p->y >q->y )
{
t->next =p;
t=p;
p=p->next ;
}
else if(p->y <q->y)
{
t->next =q;
t=q;
q=q->next ;
}
else
{
t->next =p;
t=p;
t->x =p->x +q->x ;
t->y =p->y ;
p=p->next ;
q=q->next ;
}
}
if(!p)
{
t->next =q;
t=q;
}
else if(!q)
{
t->next =p;
t=p;
}
}
return l3;
}
List Mult(List t,List l2)
{
List l4=new Node;
l4->next =NULL;
List p,q,r;
p=l4;
for(r=l2->next ;r!=NULL;r=r->next )
{
q=new Node;
q->next =NULL;
q->x =t->x * r->x;
q->y =t->y + r->y;
p->next =q;
p=q;
}
return l4;
}
void print(List l)
{
for(List p=l->next ;p!=NULL;p=p->next )
{
cout<<p->x <<" "<<p->y<<" " ;
}
cout<<endl;
}
int main(){
List l1=CreateList();
List l2=CreateList();
List l3=Merge(l1,l2);
print(l3);
List sum=NULL,temp=NULL;
for(List p=l1->next ;p!=NULL;p=p->next )
{
temp=Mult(p,l2);
sum=Merge(sum,temp);
}
print(sum);
}
答案一正确,答案二相对于答案一核心代码完全一致,但是答案二在计算时结果不正确,个人在用devc++调试时发现Mult函数 q->x =t->x * r->x; q->y =t->y + r->y;计算出的结果居然有问题,而且devc++无法查看q->x,q->y的值,求解答!!!