一元稀疏多项式加法运算.docx
- 文档编号:25809555
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:10
- 大小:152.27KB
一元稀疏多项式加法运算.docx
《一元稀疏多项式加法运算.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式加法运算.docx(10页珍藏版)》请在冰豆网上搜索。
一元稀疏多项式加法运算
一元稀疏多项式加法运算
一、需求分析
1.程序的功能
设计一个简单的一元稀疏多项式加法运算器。
一元稀疏多项式简单计算器的基本功能包括:
(1).按照指数升序次序,输入并建立多项式A与B。
(2).计算多项式A与B的和,即建立多项式A+B。
(3).按照指数升序次序,输出多项式A、B、A+B。
2.输入输出的要求
输入多项式时可以按任意次序输入各项的数据,不必按指数有序;在算法中实现建立按指数有序的多项式。
多项式的输出形式采用图形界面,通过调整指数应该出现的坐标位置来表示指数形式,如X+2X2-3X100的形式。
3.测试数据
(1).(x+3x6-8.6x11)+(6-3x6+21x9)=6+x+21x9-8.6x11
(2).(3x-3-x+4.1x2-1.2x9)+(―3x―3-5.1x2+7.8x12)=-x-x2-1.2x9+7.8x12
(3).(x+x3)+(―x―x3)=0
(4).(x+x100)+(x100+x200)=(x+2x100+x200)
(5).(x+x2+x3)+0=x+x2+x3
二、概要设计
1.输入多项式,建立多项式链表
首先创建带头结点的单链表;然后按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项:
“系数、指数对”,每输入一个子项就建立一个结点,并将其插入到多项式链表的表尾,如此重复,直至遇到输入结束标志的时候停止,最后生成按指数递增有序的链表。
2.多项式相加
多项式加法规则:
对于两个多项式中指数相同的子项,其系数相加,若系数的和非零,则构成“和多项式”中的一项;对于指数不同的项,直接构成“和多项式”中的一项。
3.多项式的输出
可以在文本界面下,采用类似于数学表达式的方式输出多项式,如多项式A可显示为:
A=3+6X∧3-2X∧8+12X∧20
3、详细设计
1. 数据类型定义可描述如下:
typedefstructpnode
{
float coef; /*系数域*/
int exp; /*指数域*/
structpnode *next; /*指针域,指向下一个系数不为的子项*/
}PolyNode,*PolyLink;
PolyLink A,B,C; /*单链表存储的多项式A、B、C*/
2.输入多项式,建立多项式链表
首先创建带头结点的单链表;然后按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项:
“系数、指数对”,必须按照升序输入,每输入一个子项就建立一个结点,并将其插入到多项式链表的表尾,如此重复,直至遇到输入结束标志的时候停止,最后生成按指数递增有序的链表。
PolyNode*createList(PolyNode*p) //建立多项式链表
{
floatm;
intn;
p=newPolyNode; //申请空间
PolyNode*newNode;
PolyNode*preNode=p;
if(p==NULL)
{
cout<<"内存分配失败!
"< returnNULL; } else { p->next=NULL; cin>>m>>n; while(m! =0||n! =0) { if(m! =0) { newNode=newPolyNode; //为新结点申请内存 if(newNode==NULL) { cout<<"内存分配失败! "< returnp; } newNode->coef=m; newNode->exp=n; preNode->next=newNode; preNode=newNode; } cin>>m>>n; } newNode->next=NULL; } returnp; } 3.多项式相加 多项式加法规则: 对于两个多项式中指数相同的子项,其系数相加,若系数的和非零,则构成“和多项式”中的一项;对于指数不同的项,直接构成“和多项式”中的一项。 将 (1)中单链表表示的两个多项式A和B相加,运算的结果是利用原表空间生成一个新链表,表示和多项式C。 运算规则如下: 设指针pa、pb分别指向多项式链表A、B的第一个结点,比较pa、pb所指两结点中的指数项: ①若pa->exp ②若pa->exp>pb->exp,则将pb所指结点插入到“和多项式”链表中去; ③若pa->exp==pb->exp,则计算系数和pa->coef+pb->coef,若和非零,插入到“和多项式”链表中去,删除pb所指结点;否则删除pa、pb所指结点。 继续比较下一项,重复上述过程,直至A、B中某一链表结束,此时将非空链表中剩余的结点出入到“和多项式”链表即可。 PolyNode*plus(PolyNode*P,PolyNode*Q) //两个多项式相加 { PolyNode*p,*q,*s,*r; p=P->next; q=Q->next; C=P; r=C; deleteQ; while(p&&q) { if(p->exp==q->exp) //指数相同时,对应项系数相加 { p->coef=p->coef+q->coef; s=p; p=p->next; q=q->next; } elseif(p->exp { s=p; p=p->next; } else { s=q; q=q->next; } if(s->coef! =0) { r->next=s; r=s; } } if(p==NULL) p=q; while(p) { s=p; p=p->next; r->next=s; r=s; } r->next=NULL; returnC; } 4.多项式的输出 可以在文本界面下,采用类似于数学表达式的方式输出多项式,如多项式A可显示为: A=3+6X∧3-2X∧8+12X∧20 需要注意: 系数值为1的非零次项的输出形式中略去系数1,如子项1x8的输出形式为x8,项-1x3的输出形式为-x3。 多项式的第一项的系数符号为正时,不输出“+”,其它项要输出“+”、“-”符号。 voidprint(PolyNode*L) //输出多项式。 { PolyNode*p; p=L->next; if(p==NULL) { cout<<"0"< return; } if(p->exp==0) //指数为零时,输出第一项系数 cout< else { //指数不为零,分情况输出系数 if(p->coef==-1) cout<<'-'; elseif(p->coef! =1) cout< cout<<'X'; if(p->exp>0&&p->exp! =1) cout<<'^'< elseif(p->exp<0) cout<<"^("< } p=p->next; while(p) { if(p->exp==0) { if(p->coef>0) cout<<"+"< else cout< } else { if(p->coef==-1) cout<<'-'; elseif(p->coef==1) cout<<'+'; elseif(p->coef>0) cout<<'+'< elseif(p->coef<0) cout< cout<<'X'; if(p->exp>0&&p->exp! =1) cout<<'^'< elseif(p->exp<0) cout<<"^("< } p=p->next; } } 4、调试分析 在该程序设计中,由于开始时对算法的不熟悉,而且对链表的认识不深,在写程序的时候经常不知道如何建立和连接指针链表,所以耗费了很长时间在学习编写链表。 在这次作业中主要运用抽象数据定义的设计方法,确实让我受益匪浅,在实际编程中,学到了很多知识。 5、测试结果 输入两个多项式,进行和的运算。 (1).(x+3x6-8.6x11)+(6-3x6+21x9)=6+x+21x9-8.6x11 (2).(3x-3-x+4.1x2-1.2x9)+(―3x―3-5.1x2+7.8x12)=-x-x2-1.2x9+7.8x12 (3).(x+x3)+(―x―x3)=0 (4).(x+x100)+(x100+x200)=(x+2x100+x200) //jiajia.cpp: 定义控制台应用程序的入口点。 // #include"stdafx.h" #include #include #include usingnamespacestd; typedefstructpnode { float coef; /*系数域*/ int exp; /*指数域*/ structpnode *next; /*指针域,指向下一个系数不为的子项*/ }PolyNode,*PolyLink; PolyLink A,B,C; /*单链表存储的多项式A、B、C*/ PolyNode*createList(PolyNode*p); //建立多项式链表 PolyNode*plus(PolyNode*P,PolyNode*Q); //两个多项式相加 voidprint(PolyLinkp); //输出多项式 int_tmain(intargc,_TCHAR*argv[])
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 稀疏 多项式 加法 运算