一元多项式计算
任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减和相乘,并将结果输出;
在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
设有一元多项式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. 0909 初识操作系统
  2. 用PHP漂亮打印JSON
  3. Codeforces 1025D(区间dp)
  4. POJ1236 Network of Schools
  5. VirtualBox虚拟机与主机互相访问开启
  6. mysql 4 中文模糊查询_解决MySQL中文模糊查询问题
  7. wamp 403 禁止访问
  8. Jave基本知识(一)
  9. wifi分析仪怎么看哪个信道好_专业的WiFi检测工具有哪些?如何解决wifi信号不好?...
  10. 如何修复苹果Mac中的快速视频播放错误
  11. 论文开题报告怎么写?
  12. 如何使用Google的Draco项目
  13. Unity Metaverse(五)、Avatar数字人换装系统的实现方案
  14. strtol,strtoul,strtod
  15. 窗函数概念知识点统计
  16. 以项目思维解读,秦穆公的“霸业梦”
  17. jython mysql_jython安装与配置
  18. 绿城x华为:抢占未来社区新风口,共绘理想生活图鉴
  19. 全球社交网络排名:QQ空间/微博/微信前十
  20. 21天自学c语言漫画版,产品经理学技术:漫画版C语言学习(一)

热门文章

  1. three.js 专题
  2. VS2019 显示行号
  3. Ansys仿真TDR
  4. 4折购书福利,再送你畅销新书
  5. Think In OO
  6. 【友盟+】O2O报告:租用车类App最受上海网民追捧!
  7. 过度取悦谷歌不如撰写好的博文
  8. win10系统右键没有“在此处打开命令窗口”菜单如何解决(转)
  9. Aop的使用(通知,日志存储等)
  10. return; return 0; return -1; return 1;的区别