大整数的运算 数据结构课程设计.docx
- 文档编号:7582641
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:20
- 大小:387.29KB
大整数的运算 数据结构课程设计.docx
《大整数的运算 数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《大整数的运算 数据结构课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
大整数的运算数据结构课程设计
一、题目概述(内容及要求)
内容:
请设计一个有效的算法,可以进行两个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< 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< 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->data 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< 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< 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(ahead,bhead);break
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大整数的运算 数据结构课程设计 整数 运算 数据结构 课程设计