一元多项式加法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

} void print()//输出多项式 { Term*tempq=head->next; cout<<"多项式为:"; while(tempq!=NULL&&tempq->next!=NULL) { float a=tempq->coef; if(a<0)cout<<"("<<tempq->coef<<")"<<"x^"<<tempq->exp<<"+"; if(a>0) cout<<tempq->coef<<"x^"<<tempq->exp<<"+"; tempq=tempq->next; } if(tempq->coef==0&&tempq->coef==head->next->coef&&tempq->ex p==head->next->exp)cout<<"0"<<endl;
int main(){ poly D,E,F; D.creatpoly(); D.print(); E.creatpoly(); E.print(); F=D+E; F.print(); return 0; }
public:
poly()//多项式构造函数 { head=tail=new Term(0,0); } void creatpoly()//创建多项式 { int max=0; float *a,m; int*b,n;int i=0;int j;bool noswap; cout<<"按系数、指数的顺序输入多项式 ,(若输入的多项式为 0,请输入 0,1)结束输入时输入 0,0:"<<endl; a=new float[max];b=new int[max]; while(cin>>m>>n&&!(m==0&&n==0)) { max++; a[max-1]=m;b[max-1]=n; } float tep;int teq; for(i=0;i<max-1;i++)//以下的两个 for 循环语句为了实现升幂 排列 { noswap=true; for(j=max-1;j>i;j--){
将其系数相加 若 若 ,将剩余的 ,将
直到 p 或 q 为 NULL
中的节点插入 上即可
中剩余部分插入到
四、 调试分析
1、 调试中遇到的问题及问题的解决方法: 调试过程中,老是遇到访问冲突的事情,还有有时候出现那种指针丢失,指向不 明的情况。 解决方法: 通过多设一个新的节点指针变量的方法,将要插入的节点的位置保存 下来,再将新的节点插入新的链表。如: while(p!=NULL) { Term*s=p; p=p->next; C.insertrear(s); } 刚开始我是这样写的 while(p!=NULL) { p=p->next; C.insertrear(p); } 这样做实际上导致了 p 的位置的改变,使其后面的链表都丢失了。 还有在判断 与 的大小时,要么相等,要么大,要么小已经构成
void creatpoly(), 而 void creatpoly()函数与 poly()都调用了 struct Term 的构造函数 Term(int c,int e);其中 void creatpoly()函数还调用了 void insertrear(Term*p)这个函 数, 再通过 main 函数调用 poly 的 print()函数,后面的程序同上调用,直到做加法的 时候, 调用了 friend poly operator+(poly A,poly B) ,而这个函数又陆续调用了 void insertrear(Term*p)函数。至此整个程序基本上已经运行完毕。 三、
if(b[j]<b[j-1]){ teq=b[j]; b[j]=b[j-1]; b[j-1]=teq; tep=a[j]; a[j]=a[j-1]; a[j-1]=tep; noswap=false; } } if(noswap)break; } for(i=0;i<=max-1;i++){ Term*temp=new Term(a[i],b[i]); insertrear(temp); } } void insertrear(Term*p)//从表尾插入节点 { p->next=tail->next; tail->next=p; tail=p;
五、 使用说明及测试结果:
使用时应按照系数、指数(无指数相同)的顺序输入,且输入的多项式是 0 时,应该输入 0 1,而不是 0 0,其中 0 0,是结束输入时的输入。 测试结果截图如下: 第一个测试数据结果如下:
第二个测试数据结果如下:
第三个测试数据结果如下:
六、 源程序; #include<iostream> #include<cmath> #include<string> using namespace std; struct Term { float coef;//系数 int exp;//指数 float x;//底数 Term *next; Term(int c,int e){coef=c;exp=e;x=0;next=NULL;}; void dishu(float y){x=y;}; }; class poly { Term *head;Term *tail;
ຫໍສະໝຸດ Baidu
if(tempq->coef<0)cout<<"("<<tempq->coef<<")"<<"x^"<<tempq->ex p<<endl;
if(tempq->coef>0)cout<<tempq->coef<<"x^"<<tempq->exp<<endl; } friend poly operator+(poly A,poly B)//加法重载 { cout<<"相加的结果";
详细设计:
各模块的伪码算法: 主要来讲讲重载“+”的实现过程的代码思路: 设 p,q 分别指向 A,B 多项式中某一节点,p,q 初值是第一节点(以 A 多项式 为基础) 由于输入的时候是按照多项式升幂形式排列的。通过新建一个链表 C,从 A、B 中分别取出一个节点 p 和 q 插入 , 后移, 不动 比较 p->exp q->exp 将 插入 , 后移, 不动 :不输出 :系数相加后输出
算法的时间复杂度:设 A 多项式有 m 项,B 多项式有 n 项, (不妨设 m<=n)每 次从 A、B 中各取出一个元素进行指数比较,比较结果为相等的几率为 1/3,至 少需要比较 m 次,时间最省,将 B 中剩余的元素插入 C 中即可,若比较结果为 不相等几率为 2/3,至多比较 n 次,再将 A 中剩余元素插入 C 中, 由上可知:比较时的时间复杂度应该是介于 O(1/3*m)与 O(2/3*n)之间,然 后输入过程生成多项式的时间复杂度为 O(m+n) ,插入时的时间复杂度介于 O (n)与 O(m+n)之间。 综上:总的时间复杂度介于 O(4/3m+2n)与 O(2m+8/3n)之间。 算法的空间复杂度: 介于 s(2n+m)与是 s(2m+2n)之间。 前者表示 A 的 m 项幂式都 存在于 B 中, 后者表示 A 的 m 项幂次与 B 的 n 项幂次皆不相同, 均要插入 C 中。
一元稀疏多项式的表示及加法运算
姓名:周勰学号:16009222 日期:2011/10/24
一、 需求分析:
1、 程序的功能:实现输入任意一元多项式并显示出来,实现两个一元稀疏 多项式的加法,并显示出来,自动实现其升幂排列输出。 2、 输入输出的要求:按系数、指数(无指数相同)的顺序输入,且系数的 类型为浮点型,指数的类型为整型,以 0 0 输入为结束的标志。输出数据 的类型与平时书写多项式的习惯相同,按升幂形式输出。 3、 测试数据为以下几个多项式: (1)7+3x+9x^8+5x^17, 8x+22x^7-9x^8 (2)0, 8x+22x^7-9x^8 (3)8x^10+22x^7-9x^8,-1 二、概要设计: 1、本程序使用的数据结构定义有如下一些: struct Term//用于存取一个指数函数的结构节点 { float coef;//系数 int exp;//指数 float x;//底数 Term *next; Term(int c,int e){coef=c;exp=e;x=0;next=NULL;}; void dishu(float y){x=y;};//输入底数 }; 创建一个关于多项式的类 class poly { Term *head;Term *tail; public: poly();//构造函数 void creatpoly();//创建一个多项式 void insertfront(Term*p);//将单个节点从表头插入 void print();//输出多项式 friend poly operator+(poly A,poly B);//重载“+”,实现多项式的加法 }; 2、主程序的流程及各程序模块之间的层次关系表现如下: 通过 main 函数调用多项式类 poly 里面的默认构造函数 poly(),创建多项式函数
else { r=new Term(q->coef,q->exp); C.insertrear(r); q=q->next; } } while(p!=NULL) { Term*s=p; p=p->next; C.insertrear(s); } while(q!=NULL) { Term*t=q; q=q->next; C.insertrear(t); } return C; } };
poly C; Term*p=A.head->next; Term*q=B.head->next; while(p!=NULL&&q!=NULL) { float xi;Term*r; int m=p->exp; int n=q->exp; if(m==n) { xi=p->coef+q->coef; r=new Term(xi,p->exp); C.insertrear(r); p=p->next; q=q->next; } else if(m<n) { r=new Term(p->coef,p->exp); C.insertrear(r); p=p->next; }
一个完备事件,应该用 if,else if,else,如果都是用 if 的话便会出现错误。因为 通过上一个 if 之后,p 和 q 的指向位置可能会有变化,因而其值会有不同,本来 每一次循环只能执行其中一项,现在却执行了其中的多项,会导致冲突出错。
2、算法的时间复杂度和空间复杂度。(若按升幂输入)
相关文档
最新文档