大整数的运算 数据结构课程设计.docx

上传人:b****9 文档编号:23405887 上传时间:2023-05-16 格式:DOCX 页数:24 大小:389.52KB
下载 相关 举报
大整数的运算 数据结构课程设计.docx_第1页
第1页 / 共24页
大整数的运算 数据结构课程设计.docx_第2页
第2页 / 共24页
大整数的运算 数据结构课程设计.docx_第3页
第3页 / 共24页
大整数的运算 数据结构课程设计.docx_第4页
第4页 / 共24页
大整数的运算 数据结构课程设计.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

大整数的运算 数据结构课程设计.docx

《大整数的运算 数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《大整数的运算 数据结构课程设计.docx(24页珍藏版)》请在冰豆网上搜索。

大整数的运算 数据结构课程设计.docx

大整数的运算数据结构课程设计

 

一、题目概述(内容及要求)

内容:

请设计一个有效的算法,可以进行两个n位大整数的四则运算。

①长整数长度在二十位以上。

②实现两长整数的加、减、乘、除操作。

要求:

1.设计数据结构,存储结构;

2.在c兼容环境完成上述题目的代码编写与调试;

3.程序运行界面交互性好;

4.软件运行,给出测试数据。

二、功能分析

1.设计一个实现长整数进行四则运算的程序,长整数长度在二十位以上,有正负数的区别。

2.输入每四位一组,组间用逗号隔开,长整数位数没有上限,以分号结束长整型数据的输入。

用lnode结点数据结构存储数据。

每一个数据有一个头结点,它的data域用来放数据的正负数。

其余结点的数都为正整数。

3.程序包含数据的输入,判断,运算,输出和主函数。

4.具体程序执行的命令包括:

a)输入函数:

inputa();inputb();//的输入并建立双向循环链表

b)判断函数:

compare();//比较数据的大小

c)运算函数:

unsigndeadd();//无符号的加法

a)unsigndesub();//无符号的减法

b)add();sub();mul();div();//加减乘除四则运算

d)输出函数:

divput();//除法结果的输出函数

a)putoutc();//其余结果的输出函数

e)主函数:

main();

 

5.系统功能结构框图

图2.1系统功能结构框图

三、设计

首先要考虑的是如何表示长整型数。

可以4位数形成1组,而一个长整型数可能会有很多组这种4位数,而每节之间是有先后顺序的,因此我们可以考虑用数组和链表来存储数据。

(1)再考虑到每个长整型数的长度在输入之间是无法预知的,因此使用链表在存储空间的分配上更方便一些。

(2)在输入数据时总是从高位到低位地存储,而计算时总是从低位向高位运算,因此采用双向链表更方便,而为了从头结点方便地转到尾结点可以采用循环链表。

综上考虑,应以双向循环链表表示长整数,每个结点含一个整型变量,且仅绝对值不超过9999的整数,整个链表用十进制数表示。

(3)对于每一个长整型数可以设置一个头结点,其中的数据域用来表示该长整型数的正负号及组数,该值的符号则表示该长整型数的符号,该数的绝对值表示该长整型数包含的4位数的组数。

第一个存储4位数据组的结点称为首结点,而最后一个4位数据组结点称为尾结点。

为此需要结构数据类型:

双向循环链表:

typedefstructlnode{//结点结构体

intdata;

structlnode*next;

structlnode*prior;

}lnode,*lnodelist

主要的模块可分为:

输入函数:

inputa();inputb();//的输入并建立双向循环链表

判断函数:

compare();//比较两个数据的大小,进行相应的的计算。

运算函数:

add();sub();mul();div();//运算

输出函数:

divput();putoutc();//除法的输出及其他运算的输出。

主函数:

main();

四、运行与测试

图4.1长整数加法运行结果图

实现以上加法操作的程序如下:

intadd(lnodelist&ahead,lnodelist&bhead)

{

inte,acount=0,bcount=0,q;

e=ahead->data*bhead->data;

cout<<"输出运算结果为:

"<

if(e==1)

{

if(ahead->data==-1)

{

cout<<"-";unsigndeadd(ahead,bhead);

}

elseunsigndeadd(ahead,bhead);

}

else

{

compare(ahead,bhead,q);

if(q==1)

{

if(ahead->data==-1)

{

cout<<"-";unsigndesub(ahead,bhead);

}

elseunsigndesub(ahead,bhead);

}

else

{

if(ahead->data==1)

{

cout<<"-";unsigndesub(bhead,ahead);

}

elseunsigndesub(bhead,ahead);

}

}

return0;

}

图4.2长整数减法运行结果图

实现以上减法操作的程序如下:

intsub(lnodelist&ahead,lnodelist&bhead)

{

inte,q;

e=ahead->data*bhead->data;

cout<<"输出运算结果为:

"<

if(e==-1)

{

if(ahead->data==-1)

{

cout<<"-";unsigndeadd(ahead,bhead);

}else{unsigndeadd(ahead,bhead);}

}

else

{

compare(ahead,bhead,q);

if(q==1)

{

if(ahead->data==-1)

{

cout<<"-";unsigndesub(ahead,bhead);

}

elseunsigndesub(ahead,bhead);

}

else

{

if(ahead->data==1)

{

cout<<"-";unsigndesub(bhead,ahead);

}

elseunsigndesub(bhead,ahead);

}

}return0;

}

图4.3长整数乘法运行结果图

实现以上乘法操作的程序如下:

intmul(lnodelist&ahead,lnodelist&bhead)

{

longmulti,carry;//进位

inte;

lnode*pa,*pb,*pc,*cnow;

lnode*p,*chead;

e=ahead->data*bhead->data;

cout<<"输出运算结果为:

"<

if(e==-1){cout<<"-";}

pa=ahead->next;

pb=bhead->next;

p=chead=newlnode;//头结点

p->data=0;

p->next=p;

p->prior=p;

pc=cnow=chead;

while(pb!

=bhead)

{

carry=0;

while(pa!

=ahead)

{

multi=pa->data*pb->data+carry;

carry=multi/10000;

if(pc->prior==chead)

{

p=newlnode;

p->data=multi%10000;

p->next=chead->next;

chead->next->prior=p;

chead->next=p;

p->prior=chead;

}

else

{

multi=pc->prior->data+multi%10000;

pc->prior->data=multi%10000;

carry=carry+multi/10000;

}

pc=pc->prior;

pa=pa->next;

}

if(carry!

=0)

{

p=newlnode;

p->data=carry;

p->next=chead->next;

chead->next->prior=p;

chead->next=p;

p->prior=chead;

}

cnow=cnow->prior;

pc=cnow;

pa=ahead->next;

pb=pb->next;

}

putoutc(chead);

returnOK;

}

图4.4长整数除法运行结果图

实现以上除法操作的程序如下:

intdivput(lnode*chead)

{

lnode*s,*pr;

pr=chead->prior;

if(pr!

=chead)

{cout<data;pr=pr->prior;}

while(pr!

=chead)

{

if(pr->data==0)

cout<<"0000";

elseif(pr->data>0&&pr->data<10)

cout<<"000";

elseif(pr->data>=10&&pr->data<100)

cout<<"00";

elseif(pr->data>=100&&pr->data<1000)

cout<<"0";

cout<data;

s=pr;

pr=pr->prior;

deletes;

}

cout<

return0;

}

intdiv(lnodelist&ahead,lnodelist&bhead)

{

cout<<"输出运算结果为:

"<

lnode*pa,*pb,*s,*p;

intborrow=0,diffe,count=0,q,acount=0,bcount=0,e;//借位e=ahead->data*bhead->data;

cout<<"输出运算结果为:

"<

cout<<"商为";if(e==-1){cout<<"-";}

while(borrow==0)

{

compare(ahead,bhead,q);

if(q==0){borrow=1;cout<<++count<<",余数为0"<

elseif(q==-1){borrow=1;cout<

else

{

count=count+1;

pa=ahead->next;

pb=bhead->next;

while(pa!

=ahead&&pb!

=bhead)

{

diffe=pa->data-borrow-pb->data;

if(diffe<0){borrow=1;diffe=diffe+10000;}

elseborrow=0;

pa->data=diffe;

pa=pa->next;

pb=pb->next;

}

if(pa!

=ahead)

{

while(pa!

=ahead)

{

diffe=pa->data-borrow;

if(diffe<0){borrow=1;diffe+=10000;}elseborrow=0;

pa->data=diffe;

pa=pa->next;

}

}

p=pa->prior;

while(p->data==0&&p->prior!

=ahead)

{

s=p;p=p->prior;

ahead->prior=p;

p->next=ahead;

deletes;

}

}

}

return0;

}

附录(其它代码实现):

第一部分:

#include

usingnamespacestd;

#defineOK1;

#defineFALSE0;

typedefstructlnode

{//结点结构体

intdata;

structlnode*next;

structlnode*prior;

}lnode,*lnodelist;

intcompare(lnodelist&ahead,lnodelist&bhead,int&q)//比较a和b的大小

{

lnode*pa,*pb;

intbcount=0,acount=0;

pa=ahead->next;

pb=bhead->next;

while(pa!

=ahead)

{acount++;pa=pa->next;}

while(pb!

=bhead)

{bcount++;pb=pb->next;}

if(acount>bcount)q=1;

elseif(acount

else

{

pa=ahead->prior;

pb=bhead->prior;

while((pa->data==pb->data)&&(pa->prior!

=ahead))

{

pa=pa->prior;

pb=pb->prior;

}

if(pa->data>pb->data)

q=1;

elseif(pa->datadata)

q=-1;

elseq=0;

}

return0;

}

intinputa(lnodelist&ahead)//输入长整数a

{

lnode*p;charch;

intafirst;

cout<<"请输入第一个无符号长整型数,要求每四位用逗号隔开末尾为分号:

"<

p=ahead=newlnode;//头结点

p->data=0;

p->next=p;

p->prior=p;

cin>>afirst>>ch;//输入第一个结点数据

if(afirst<0)

{ahead->data=-1;afirst=-afirst;}

elseahead->data=1;

p=newlnode;

p->data=afirst;

p->next=ahead;

ahead->prior=p;

ahead->next=p;

p->prior=ahead;

while(ch!

=';')

{

cin>>afirst>>ch;

p=newlnode;

p->data=afirst;

p->next=ahead->next;

ahead->next->prior=p;

ahead->next=p;

p->prior=ahead;

}

returnOK;

}

intinputb(lnodelist&bhead)//输入长整数b

{

lnode*p;charch;

intbfirst;

cout<<"请输入第二个无符号长整型数,要求每四位用逗号隔开末尾为分号:

"<

p=bhead=newlnode;//头结点

p->data=0;

p->next=p;

cin>>bfirst>>ch;//输入第一个结点数据

if(bfirst<0)

{

bhead->data=-1;

bfirst=-bfirst;

}

elsebhead->data=1;

p=newlnode;

p->data=bfirst;

p->next=bhead;

bhead->prior=p;

bhead->next=p;

p->prior=bhead;

while(ch!

=';')

{

cin>>bfirst>>ch;

p=newlnode;

p->data=bfirst;

p->next=bhead->next;

bhead->next->prior=p;

bhead->next=p;

p->prior=bhead;

}

returnOK;

}

voidputoutc(lnode*chead)//输出结果

{

lnode*s,*pr;

pr=chead->next;

if(pr!

=chead)

{

cout<data;

pr=pr->next;

}

while(pr!

=chead)

{if(pr->data==0)

cout<<"0000";

elseif(pr->data>0&&pr->data<10)

cout<<"000";

elseif(pr->data>=10&&pr->data<100)

cout<<"00";

elseif(pr->data>=100&&pr->data<1000)

cout<<"0";

cout<data;

s=pr;

pr=pr->next;

deletes;

}

cout<

}

intunsigndeadd(lnodelist&ahead,lnodelist&bhead)//无符号长整数的加法

{

intsum,carry=0;//进位

lnode*pa,*pb;

lnode*p,*chead;

pa=ahead->next;

pb=bhead->next;

p=chead=newlnode;//头结点

p->data=0;

p->next=p;

p->prior=p;

while(pa!

=ahead&&pb!

=bhead)

{sum=pa->data+pb->data+carry;

p=newlnode;

p->data=sum%10000;

carry=sum/10000;

p->next=chead->next;

chead->next->prior=p;

chead->next=p;

p->prior=chead;

pa=pa->next;

pb=pb->next;

}

if(pa!

=ahead)//a还没有处理完,把a剩下的数字加到和上

{while(pa!

=ahead)

{

sum=pa->data+carry;

p=newlnode;

p->data=sum%10000;

p->next=chead->next;

chead->next->prior=p;

chead->next=p;

p->prior=chead;

carry=sum/10000;

pa=pa->next;

}

}

if(pb!

=bhead)//b还没有处理完,把b剩下的数字加到和上

{while(pb!

=bhead)

{

sum=pb->data+carry;

p=newlnode;

p->data=sum%10000;

p->next=chead->next;

chead->next->prior=p;

chead->next=p;

p->prior=chead;

carry=sum/10000;

pb=pb->next;

}

}

if(carry)//如果最后一位有进位,就申请一个结点存储

{p=newlnode;

p->data=carry;

p->next=chead->next;

chead->next->prior=p;

chead->next=p;

p->prior=chead;

}

putoutc(chead);

returnOK;

}

intunsigndesub(lnodelist&ahead,lnodelist&bhead)//无符号长整数的减法a比b大。

{

intdiffe,borrow=0;//借位

lnode*pa,*pb,*chead;

lnode*p;

pa=ahead->next;

pb=bhead->next;

p=chead=newlnode;//头结点

p->data=0;

p->next=p;

p->prior=p;

while(pa!

=ahead&&pb!

=bhead)

{

diffe=pa->data-borrow-pb->data;

if(diffe<0){borrow=1;diffe+=10000;}elseborrow=0;

p=newlnode;//存储差

p->data=diffe;

p->next=chead->next;

chead->next->prior=p;

chead->next=p;

p->prior=chead;

pa=pa->next;

pb=pb->next;

}

if(pa!

=ahead)

{while(pa!

=ahead)

{diffe=pa->data-borrow;

if(diffe<0){borrow=1;diffe+=10000;}elseborrow=0;

p=newlnode;//存储差

p->data=diffe;

p->next=chead->next;

chead->next->prior=p;

chead->next=p;

p->prior=chead;

pa=pa->next;

}

}

while(p->data==0&&p->next!

=chead)

{

lnode*s;

s=p;p=p->next;

chead->next=p;

p->prior=chead;

deletes;

}

putoutc(chead);

returnOK;

}

第二部分:

intxuan(int&c)

{cout<<"开始菜单"<

cout<<"*************请选择要进行的操作:

***********"<

cout<<"1.加法运算2.减法运算3.乘法运算4.除法运算"<

cin>>c;

return0;

}

intmain()

{

intc,h;charb;

lnodelistahead,bhead;

inputa(ahead);

inputb(bhead);

do

{

xuan(c);

switch(c)

{

case1:

add(ahead,bhead);break;

case2:

sub(ahea

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

当前位置:首页 > 自然科学 > 物理

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

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