一元多项式计算
任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减和相乘,并将结果输出;
在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
设有一元多项式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)。
要求:

  1. 首先判定多项式是否稀疏(个人判定以系数为0的项数大于项的最大次数加+1除2)
  2. 分别采用顺序和动态存储结构实现;
  3. 结果M(x)中无重复阶项和无零系数项;
  4. 要求输出结果的升幂和降幂两种排列情况

#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;elsecout<<"表达式正常"<<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;elsecout<<"表达式正常"<<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;}elsewhile(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;}}}
}

一元多项式计算实验报告(相加,相减,相乘)相关推荐

  1. sperling指标 matlab,sperling指标计算实验报告

    sperling指标计算实验报告 Sperling 指标计算实验报告 一. 计算原理: 数据给出的信息为时域中的加速度信号.时间的单位为 sec,加速度单位为 m/s^2 1.将时域的信号转化为频域下 ...

  2. Java 计算两个日期相减并转换成月份

    来自:https://www.shixinwl.com/article/132 Java 计算两个日期相减并转换成月份 在网上找了很多类似方法结果都是垃圾,于是乎记录下来给需要的人 import ja ...

  3. 计算机量子化学计算实验报告物化实验,experimental report:量子化学计算(HMO).pdf...

    experimental report:量子化学计算(HMO) 武汉大学化学与分子科学学院物理化学课程实验报告 之 量子化学计算 刘凯 化基二班 2014301040058 2016 年3 月2 日 ...

  4. js 计算两个时间相减获得对应的天,小时,分钟

    计算时间差,可以使用DATE对象 var beginDate = new Date(beginDateStr); var endDate = new Date(endDateStr); var hou ...

  5. photoshop中RGB三色原理及颜色相加相减

    From: http://blog1.poco.cn/myBlogDetail-htx-id-5921820-userid-55622677-pri--n-0.xhtml 一.RGB三色原理 在中学的 ...

  6. 计算机量子化学计算实验报告物化实验,量子化学计算方法及应用实验报告.docx...

    量子化学计算方法及应用实验报告 量子化学计算方法及应用实验报告 篇一:Gaussion软件在化学键长计算中的应用 毕业论文(设计)开题报告 (学生用表) 篇二:几种计算软件 Gaussian: 量子化 ...

  7. 汇编语言实现两字节相加相减代码

    1.两字节数相减 DATA SEGMENT DATA1 DW  9526H,5311H   ;表示数据53119526H DATA2 DW    9503H,4783H   ;表示数据47839503 ...

  8. 计算机中的二进制实验报告,+实验二 计算机的数据表示和计算.doc

    实验2 计算机中的数据表示与计算 实验报告 学号1500202151 姓名叶思凡 班级:卫生检验与检疫15 实验时间: 2017年 3 月 2 日 实验报告表2-1 数值型数据在计算机中的二进制实验记 ...

  9. html 两个时间戳相减,表格里两列时间点如何相减

    EXCEL表中如何让两列时间相减 两列时间,格式是常规,显示如:24时20分,如果我直接相减(比如C1=A1-B时间是特殊的数值形式,直接相减即可 Excel版本参考:2010 测试数据在A1和A2单 ...

最新文章

  1. 飞信2015服务器未响应,即时通信天下已定 飞信再难复活
  2. dataTable 表格组件刷新 问题记录
  3. linux xargs 给命令传递参数 组合多个命令
  4. python语言怎么用-这些小游戏是怎么用Python语言制作出来的……
  5. 设计模式系列之----观察者模式
  6. 前端学习(305):bootstrap4之工具方法
  7. 寄存器(内存访问)07 - 零基础入门学习汇编语言19
  8. PAT乙级(1024 科学计数法)
  9. 2010年3月份第二周51aspx发布源码
  10. 在网页设计中,引导页是所有页面中的重中之重,引导浏览者很快进入各栏目页面,是一个网站的灵魂所在。
  11. access 的几种更新语句:update where 与 update join where
  12. 安防区块链技术的落地应用
  13. 永磁同步电机转速电流双闭环PI+MTPA+弱磁控制Simulink仿真模型
  14. Ps图片文字处理与python多张图片合成
  15. 一份完整的聚合支付设计方案,喜欢就拿去用吧!
  16. Linux系统各发行版镜像下载
  17. 30岁程序员:总在错过风口,终于熬成“码畜”
  18. 基于ARM的智能灯光控制系统(4)数据结构
  19. 大数据早报:搜狐《数字之道》,召唤新势力 十一数据观:钱和人都去哪了?(10.10)
  20. SketchUp等设计软件官方推荐电脑配置 |干货

热门文章

  1. AQICN-深圳雾霾天气
  2. TOEFL wordlist 20
  3. 计算机英语中文参考书,计算机专业英语
  4. Jetson Xavier NX 源码安装Cmake
  5. css基础-3-文本样式
  6. 【剑指Offer】42. 连续子数组的最大和
  7. Unity 锚点 Anchors
  8. 【计算机毕业文章】电动车智能充电服务平台
  9. 正则表达式验证邮箱地址abc132@163.com
  10. scrapy框架爬取古诗文网的名句