设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
分析:这是数据结构中典型的例题,其中加法运算经常遇到,乘法运算不常见,涉及到多项式相乘算法,同类项合并算法以及对于系数为0时的处理。这道题充分锻炼了对了链表的理解和操作。
#include<iostream>
using namespace std;
typedef struct PolyNode
{
int coef;
int expon;
struct PolyNode * next;
}*Polynomial;
Polynomial ReadPoly()//输入(尾插法)
{
int n;
cin >>n;
Polynomial L=new PolyNode;
Polynomial r=L;
L->next=NULL;
while(n--)
{
Polynomial p=new PolyNode;
cin>>p->coef>>p->expon;
if(p->coef==0)//系数为0,不读
{
delete p;
continue;
}
p->next=NULL;
r->next=p;
r=p;
}
return L;
}
Polynomial Mult(Polynomial P1,Polynomial P2)
{
Polynomial p1=P1->next;
Polynomial p2=P2->next;
Polynomial P3=new PolyNode;
Polynomial temp=new PolyNode;
temp->coef=1000000001;
temp->expon=10001;
P3->next=temp;
Polynomial temp2=new PolyNode;
temp2->coef=-1000000001;
temp2->expon=-10001;
temp->next=temp2;
temp2->next=NULL;
//while(p1)
for(p1=P1->next;p1!=NULL;p1=p1->next)
{
for(p2=P2->next;p2!=NULL;p2=p2->next)
//while(p2)
{
Polynomial p3=new PolyNode;
p3->coef=(p1->coef)*(p2->coef);
p3->expon=p1->expon+p2->expon;
p3->next=NULL;
if(p3->coef==0)
{
continue;
}
for(Polynomial pp=P3->next;pp->next!=NULL;pp=pp->next)
{
if(pp->expon==p3->expon)
{
pp->coef+=p3->coef;
break;
}
if(p3->expon < pp->expon && p3->expon > pp->next->expon)
{
p3->next=pp->next;
pp->next=p3;
break;
}
}
}
}
P3->next=P3->next->next;
Polynomial pk=P3;
while(pk)//删除后标志
{
if(pk->next->next==NULL)
pk->next=NULL;
pk=pk->next;
}
pk=P3->next;
Polynomial pr=P3;
while(pk)
{
if(pk->coef==0)
{
pr->next=pk->next;
pk=pk->next;
}
pk=pk->next;
pr=pr->next;
}
return P3;
}
void PrintPoly(Polynomial p)
{
if(p->next==NULL)
cout<<0<<" "<<0<<endl;
p=p->next;
while(p)
{
cout<<p->coef<<" "<<p->expon;
if(p->next==NULL)
{
cout<<endl;
}
else
cout<<" ";
p=p->next;
}
}
Polynomial Add(Polynomial P1,Polynomial P2)
{
Polynomial p1=P1->next;
Polynomial p2=P2->next;
Polynomial P3=new PolyNode;
Polynomial r3=P3;
P3->next=NULL;
while(p1&&p2)
{
if(p1->expon==p2->expon)
{
if(p1->coef+p2->coef!=0)
{
Polynomial p3=new PolyNode;
p3->coef=(p1->coef)+(p2->coef);
p3->expon=p2->expon;
p3->next=NULL;
r3->next=p3;
r3=p3;
p1=p1->next;
p2=p2->next;
}
else
{
p1=p1->next;
p2=p2->next;
}
}
else if(p1->expon>p2->expon)
{
Polynomial p3=new PolyNode;
p3->coef=p1->coef;
p3->expon=p1->expon;
p3->next=NULL;
r3->next=p3;
r3=p3;
p1=p1->next;
}
else
{
Polynomial p3=new PolyNode;
p3->coef=p2->coef;
p3->expon=p2->expon;
p3->next=NULL;
r3->next=p3;
r3=p3;
p2=p2->next;
}
}
r3->next=p1?p1:p2;
return P3;
}
int main()
{
Polynomial P1,P2,PP,PS;
P1=ReadPoly();
P2=ReadPoly();
PP=Mult(P1,P2);
PrintPoly(PP);
PS=Add(P1,P2);
PrintPoly(PS);
//system("PAUSE");
return 0;
}
运行结果如下
转载请附上原文链接