一元稀疏多项式加法运算.docx

上传人:b****7 文档编号:25809555 上传时间:2023-06-15 格式:DOCX 页数:10 大小:152.27KB
下载 相关 举报
一元稀疏多项式加法运算.docx_第1页
第1页 / 共10页
一元稀疏多项式加法运算.docx_第2页
第2页 / 共10页
一元稀疏多项式加法运算.docx_第3页
第3页 / 共10页
一元稀疏多项式加法运算.docx_第4页
第4页 / 共10页
一元稀疏多项式加法运算.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

一元稀疏多项式加法运算.docx

《一元稀疏多项式加法运算.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式加法运算.docx(10页珍藏版)》请在冰豆网上搜索。

一元稀疏多项式加法运算.docx

一元稀疏多项式加法运算

一元稀疏多项式加法运算

一、需求分析

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->expexp,则将pa所指结点插入到“和多项式”链表中去;

②若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->expexp)   

{

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<coef;

else          

{             //指数不为零,分情况输出系数

if(p->coef==-1)

cout<<'-';

elseif(p->coef!

=1)

cout<coef;

cout<<'X';

if(p->exp>0&&p->exp!

=1)

cout<<'^'<exp;

elseif(p->exp<0)

cout<<"^("<exp<<")";

}

p=p->next;

while(p)

{

if(p->exp==0)

{

if(p->coef>0)

cout<<"+"<coef;

else

cout<coef;

}

else

{

if(p->coef==-1)

cout<<'-';

elseif(p->coef==1)

cout<<'+';

elseif(p->coef>0)

cout<<'+'<coef;

elseif(p->coef<0)

cout<coef;

cout<<'X';

if(p->exp>0&&p->exp!

=1)

cout<<'^'<exp;

elseif(p->exp<0)

cout<<"^("<exp<<")";

}

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[])

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1