一元多项式计算
任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减和相乘,并将结果输出;
在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
设有一元多项式Am(x)和Bn(x).
Am(x)=A0+A1x1+A2x2+A3x3+… +Amxm
Bn(x)=B0+B1x1+B2x2+B3x3+… +Bnxn
请实现求M(x)=Am(x)+Bn(x),M(x)=Am(x)-Bn(x)和M(x)=Am(x)×Bn(x)。
要求:
- 首先判定多项式是否稀疏(个人判定以系数为0的项数大于项的最大次数加+1除2)
- 分别采用顺序和动态存储结构实现;
- 结果M(x)中无重复阶项和无零系数项;
- 要求输出结果的升幂和降幂两种排列情况
#include <bits/stdc++.h>
using namespace std;
struct A//定义双向链表,方便降幂输出
{
int a;
int b;
struct A*prior;
struct A*next;
};
void paixu(struct A* head,struct A*p)//链表幂从小到大排序,进来一个排一个
{
struct A*p1,*p2;
int flag=0;
if(head->next==NULL)
{
p->next=head->next;
head->next=p;
}
else
{
p1=head;
p2=head->next;
while(p2!=NULL)
{
if(p->b<p2->b)
{
p1->next=p;
p->next=p2;
flag=1;
break;
}
else if(p->b==p2->b)
{
p2->a+=p->a;
flag=1;
break;
}
else
{
p1=p2;
p2=p2->next;
}
}
if(flag==0)
{
p1->next=p;
p->next=NULL;
}
}
}
void jia1(struct A*head1,struct A*head2,struct A*head3)//链表相加
{
struct A*p1,*p2,*p3,*p;
p1=head1->next;
p2=head2->next;
p3=head3;//有意思
head3->next=NULL;//避免运行加减函数互相影响
while(p1!=NULL&&p2!=NULL)
{
p=(struct A*)malloc(sizeof(struct A));
p->next=NULL;
if(p1->b==p2->b)
{
if(p1->a+p2->a!=0)//链表相加为0,直接不录入
{
p->a=p1->a+p2->a;
p->b=p1->b;
p3->next=p;
p3=p;
}
p1=p1->next;
p2=p2->next;
}
else if(p1->b<p2->b)
{
p->a=p1->a;
p->b=p1->b;
p3->next=p;
p3=p;
p1=p1->next;
}
else
{
p->a=p2->a;
p->b=p2->b;
p3->next=p;
p3=p;
p2=p2->next;
}
}
if(p1==NULL)
{
while(p2!=NULL)
{
p=(struct A*)malloc(sizeof(struct A));
p->next=NULL;
p->a=p2->a;
p->b=p2->b;
p3->next=p;
p3=p;
p2=p2->next;
}
}
else
{
while(p1!=NULL)
{
p=(struct A*)malloc(sizeof(struct A));
p->next=NULL;
p->a=p1->a;
p->b=p1->b;
p3->next=p;
p3=p;
p1=p1->next;
}
}
}
void jian1(struct A*head1,struct A*head2,struct A*head3)//链表相减,只需在加的基础上改+为-
{
struct A*p1,*p2,*p3,*p;
p1=head1->next;
p2=head2->next;
p3=head3;//有意思
head3->next=NULL;//重要
while(p1!=NULL&&p2!=NULL)
{
p=(struct A*)malloc(sizeof(struct A));
p->next=NULL;
if(p1->b==p2->b)
{
if(p1->a-p2->a!=0)
{
p->a=p1->a-p2->a;
p->b=p1->b;
p3->next=p;
p3=p;
}
p1=p1->next;
p2=p2->next;
}
else if(p1->b<p2->b)
{
p->a=-p1->a;
p->b=p1->b;
p3->next=p;
p3=p;
p1=p1->next;
}
else
{
p->a=-p2->a;
p->b=p2->b;
p3->next=p;
p3=p;
p2=p2->next;
}
}
if(p1==NULL)
{
while(p2!=NULL)
{
p=(struct A*)malloc(sizeof(struct A));
p->next=NULL;
p->a=-p2->a;
p->b=p2->b;
p3->next=p;
p3=p;
p2=p2->next;
}
}
else
{
while(p1!=NULL)
{
p=(struct A*)malloc(sizeof(struct A));
p->next=NULL;
p->a=-p1->a;
p->b=p1->b;
p3->next=p;
p3=p;
p1=p1->next;
}
}
}
int chen1(struct A*head1,struct A*head2,struct A*head3,struct A*head4,struct A*head5)//链表相乘,化为相加
{
struct A*p1,*p2,*p3,*p4,*p5,*p;
int i=1;
p1=head1->next;
while(p1!=NULL)
{
p2=head2->next;
p5=head5->next;
while(p2!=NULL)
{
p5->a=p1->a*p2->a;
p5->b=p1->b+p2->b;
p5=p5->next;
p2=p2->next;
}
//head4,head3作为容器,进行连加,好像可以不用
if(i==1)
{
jia1(head5,head4,head3);
i=2;//标志
}
else
{
jia1(head5,head3,head4);
i=1;//标志
}
p1=p1->next;
}
return i;//判断最后的容器是head3,还是head4;
}
void xishu(int a[],int max)//顺序存储判断稀疏
{
int min=0;
for(int i=0;i<=max;i++)
{
if(a[i]==0)
min++;
}
if(min>(max+1)/2)
cout<<"表达式稀疏"<<endl;
else
cout<<"表达式正常"<<endl;
}
void xishu1(struct A*head)//链式存储判断稀疏
{
struct A*p;int i=0,max=0;
p=head->next;
while(p!=NULL)
{ i++;
if(max<p->b)
max=p->b;
p=p->next;
}
if(i<=(max+1)/2)
cout<<"表达式稀疏"<<endl;
else
cout<<"表达式正常"<<endl;
}
void jia(int a[],int b[],int c[],int maxa,int maxb,int &maxc,int &flag)//顺序存储相加
{
maxc=maxa>maxb?maxa:maxb;
cout<<"顺序:";
for(int i=0;i<=maxc;i++)//注意maxc包含在内
{
c[i]=a[i]+b[i];
if(c[i]!=0)
{cout<<c[i]<<"*x^"<<i<<" ";
flag=1;}
}
if(flag==0)
cout<<"0";
cout<<endl;
cout<<"逆序:";
for(int i=maxc;i>=0;i--)//注意maxc包含在内
{
if(c[i]!=0)
{cout<<c[i]<<"*x^"<<i<<" ";
flag=1;}
}
}
void jian(int a[],int b[],int c[],int maxa,int maxb,int &maxc,int &flag)//顺序存储相减
{
maxc=maxa>maxb?maxa:maxb;
cout<<"顺序:";
for(int i=0;i<=maxc;i++)//注意maxc包含在内
{
c[i]=a[i]-b[i];
if(c[i]!=0)
{cout<<c[i]<<"*x^"<<i<<" ";
flag=1;}
}
if(flag==0)
cout<<"0";
cout<<endl;
cout<<"逆序:";
for(int i=maxc;i>=0;i--)//注意maxc包含在内
{
if(c[i]!=0)
{cout<<c[i]<<"*x^"<<i<<" ";
flag=1;}
}
}
void chen(int a[],int b[],int c[],int maxa,int maxb,int &maxc,int &flag)//顺序存储相乘
{
for(int i=0;i<=maxa;i++)
for(int j=0;j<=maxb;j++)
{
if(a[i]!=0&&b[j]!=0)
{
c[i+j]+=a[i]*b[j];
}
}
cout<<"顺序:";
for(int i=0;i<=maxa+maxb;i++)
{
if(c[i]!=0)
{
cout<<c[i]<<"*x^"<<i<<" ";
flag=1;
}
}
if(flag==0)
cout<<"0";
cout<<endl;
cout<<"逆序:";
for(int i=maxa+maxb;i>=0;i--)
{
if(c[i]!=0)
{
cout<<c[i]<<"*x^"<<i<<" ";
flag=1;
}
}
}
int main()
{
int n1,n2,e,f,maxa,maxb,maxc,sum,sum1,flag;
int a[100],b[100],c[100];
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
maxa=maxb=maxc=0;
char d;
cout<<"请输入数字,数字1表示进行顺序存储,数字2表示进行动态存储"<<endl;
cin>>sum;
while(sum!=1&&sum!=2)
{
cout<<"输入错误,请输入数字,数字1表示进行顺序存储,数字2表示进行动态存储"<<endl;
cin>>sum;
}
cout<<"输入成功"<<endl;
if(sum==2)
{
struct A *head1,*head2,*p,*head3,*head4,*head5,*p1,*p2,*p3;
head1=(struct A*)malloc(sizeof(struct A));
head2=(struct A*)malloc(sizeof(struct A));
head3=(struct A*)malloc(sizeof(struct A));
head4=(struct A*)malloc(sizeof(struct A));
head5=(struct A*)malloc(sizeof(struct A));
head1->next=NULL;//有意思
head2->next=NULL;
head3->next=NULL;
head4->next=NULL;
head5->next=NULL;
cout<<"请输入第一个表达式的项个数"<<endl;
cin>>n1;
while(n1<=0)
{
cout<<"请重新输入,输入值需大于0"<<endl;
cin>>n1;
}
cout<<"输入成功"<<endl;
cout<<"请输入第一个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
for(int i=0; i<n1; i++)
{
cin>>e>>d>>f;
p=(struct A*)malloc(sizeof(struct A));
if(e!=0)
{
p->a=e;
p->b=f;
paixu(head1,p);
}
}
xishu1(head1);
cout<<"请输入第二个表达式的项个数"<<endl;
cin>>n2;
while(n2<=0)
{
cout<<"请重新输入,输入值需大于0"<<endl;
cin>>n2;
}
cout<<"输入成功"<<endl;
cout<<"请输入第二个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
p1=head5;
for(int i=0; i<n2; i++)
{
cin>>e>>d>>f;
p=(struct A*)malloc(sizeof(struct A));
if(e!=0)
{
p->a=e;
p->b=f;
p2=(struct A*)malloc(sizeof(struct A));
p2->next=NULL;
p1->next=p2;
p1=p2;
paixu(head2,p);
}
}
xishu1(head2);
cout<<"输入1表示相加,输入2表示相减,输入3表示相乘"<<endl;
cin>>sum1;
while(sum1!=1&&sum1!=2&&sum1!=3)
{
cout<<"输入错误,请重新输入"<<endl;
cin>>sum1;
}
cout<<"输入成功"<<endl;
while(1)
{
flag=0;
if(sum1==1)
{
jia1(head1,head2,head3);
cout<<"顺序:";
p=head3->next;
p3=head3;
while(p)
{
cout<<p->a<<"*x^"<<p->b<<" ";
p->prior=p3;//顺便从后往前链接
p3=p;
p=p->next;
flag=1;
}
if(flag==0)
cout<<"0";
cout<<endl;
cout<<"逆序:";
while(p3!=head3)
{
cout<<p3->a<<"*x^"<<p3->b<<" ";
p3=p3->prior;
}
if(flag==0)
cout<<"0";
cout<<endl;
}
if(sum1==2)
{
jian1(head1,head2,head3);
cout<<"顺序:";
p=head3->next;
p3=head3;
while(p)
{
cout<<p->a<<"*x^"<<p->b<<" ";
p->prior=p3;//顺便从后往前链接
p3=p;
p=p->next;
flag=1;
}
if(flag==0)
cout<<"0";
cout<<endl;
cout<<"逆序:";
while(p3!=head3)
{
cout<<p3->a<<"*x^"<<p3->b<<" ";
p3=p3->prior;
}
if(flag==0)
cout<<"0";
cout<<endl;
}
if(sum1==3)
{
if(chen1(head1,head2,head3,head4,head5)==2)
{p=head3->next;p3=head3;}
else
{p=head4->next;p3=head4;}
cout<<"顺序:";
while(p)
{
cout<<p->a<<"*x^"<<p->b<<" ";
p->prior=p3;//顺便从后往前链接
p3=p;
p=p->next;
flag=1;
}
if(flag==0)
cout<<"0";
cout<<endl;
cout<<"逆序:";
if(chen1(head1,head2,head3,head4,head5)==2)
while(p3!=head3)
{
cout<<p3->a<<"*x^"<<p3->b<<" ";
p3=p3->prior;
}
else
while(p3!=head4)
{
cout<<p3->a<<"*x^"<<p3->b<<" ";
p3=p3->prior;
}
if(flag==0)
cout<<"0";
cout<<endl;
}
cout<<"输入1表示相加,输入2表示相减,输入3表示相乘,输入0结束"<<endl;
cin>>sum1;
while(sum1!=1&&sum1!=2&&sum1!=3&&sum1!=0)
{
cout<<"输入错误,请重新输入";
cin>>sum1;
}
if(sum1==0)
{
cout<<"结束";
break;
}
}
}
else
{
cout<<"请输入第一个表达式的项个数"<<endl;
cin>>n1;
while(n1<=0)
{
cout<<"请重新输入,输入值需大于0"<<endl;
cin>>n1;
}
cout<<"输入成功"<<endl;
cout<<"请输入第一个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
for(int i=0;i<n1;i++)
{
cin>>e>>d>>f;
a[f]+=e;
if(maxa<f)
maxa=f;
}
xishu(a,maxa);
cout<<"请输入第二个表达式的项个数"<<endl;
cin>>n2;
while(n2<=0)
{
cout<<"请重新输入,输入值需大于0"<<endl;
cin>>n2;
}
cout<<"输入成功"<<endl;
cout<<"请输入第二个表达式,每个项的系数和指数以','分隔,项与项之间以空格或回车分隔"<<endl;
for(int i=0;i<n2;i++)
{
cin>>e>>d>>f;
b[f]+=e;
if(maxb<f)//检查相同的话
maxb=f;
}
xishu(b,maxb);
cout<<"输入1表示相加,输入2表示相减,输入3表示相乘"<<endl;
cin>>sum1;
while(sum1!=1&&sum1!=2&&sum1!=3)
{
cout<<"输入错误,请重新输入"<<endl;
cin>>sum1;
}
cout<<"输入成功"<<endl;
while(1)
{ flag=0;
if(sum1==1)
{
jia(a,b,c,maxa,maxb,maxc,flag);
if(flag==0)
cout<<"0";
cout<<endl;
}
if(sum1==2)
{
jian(a,b,c,maxa,maxb,maxc,flag);
if(flag==0)
cout<<"0";
cout<<endl;
}
if(sum1==3)
{
chen(a,b,c,maxa,maxb,maxc,flag);
if(flag==0)
cout<<"0";
cout<<endl;
}
memset(c,0,sizeof(c));
cout<<"输入1表示相加,输入2表示相减,输入3表示相乘,输入0结束"<<endl;
cin>>sum1;
while(sum1!=1&&sum1!=2&&sum1!=3&&sum1!=0)
{
cout<<"输入错误,请重新输入";
cin>>sum1;
}
if(sum1==0)
{
cout<<"结束";
break;
}
}
}
}