您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 数据结构大型实验大整数运算系统(附源代码)
数据结构大型实验实验报告(附源代码)浙江工业大学朱镇洋曹耀明陈华族目录第一部分要求与概述一、实验目的以及准备1.1.1问题描述........................................................1.1.2基本要求........................................................1.1.3设计思路........................................................第二部分具体实现一、代码部分2.1.1链表类及大数类的部分说明以及部分源码.............................2.1.2部分简单函数功能.................................................2.1.3加法.............................................................2.1.4减法.............................................................2.1.5乘法.............................................................2.1.6除法.............................................................2.1.7幂运算...........................................................2.1.8二进制和十进制的相互转化.........................................二、程序流程及函数间关系2.2.1程序流程图.......................................................2.2.2函数调用关系分析.................................................三、实验验证分析2.3.1输入的形式和输入值的范围.........................................2.3.2输出的形式.......................................................2.3.3程序所能达到的功能................................................2.3.4测试数据.........................................................四、调试分析2.4.1调试过程中的主要技术问题以及具体的解决方法........................2.4.2印象最深刻的3个调试错误,及修正方法..............................五、附录2.5.1源代码及其所属文件................................................第一部分要求与概述1.1.1问题描述•密码学分为两类密码:对称密码和非对称密码。对称密码主要用于数据的加/解密,而非对称密码则主要用于认证、数字签名等场合。非对称密码在加密和解密时,是把加密的数据当作一个大的正整数来处理,这样就涉及到大整数的加、减、乘、除和指数运算等,同时,还需要对大整数进行输出。请采用相应的数据结构实现大整数的加、减、乘、除和指数运算,以及大整数的输入和输出。1.1.2基本要求•要求采用链表来实现大整数的存储和运算,不允许使用标准模板类的链表类(list)和函数。同时要求可以从键盘输入大整数,也可以文件输入大整数,大整数可以输出至显示器,也可以输出至文件。大整数的存储、运算和显示,可以同时支持二进制和十进制,但至少要支持十进制。大整数输出显示时,必须能清楚地表达出整数的位数。测试时,各种¯况都需要测试,并附上测试截图;•要求大整数的长度可以不受限制,即大整数的十进制位数不受限制,可以为十几位的整数,也可以为500多位的整数,甚至更长;•大整数的运算和显示时,只需要考虑正的大整数。如果可能的话,请以秒为单位显示每次大整数运算的时间;•要求采用类的设计路,不允许出现类以外的函数定义,但允许友元函数。主函数中只能出现类的成员函数的调用,不允许出现对其它函数的调用。•要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函数main存储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和实现都放在.h文件中;•要求源程序中有相应注释;•不强制要求采用类模板,也不要求采用可视化窗口;•要求测试例子要比较详尽,各种极限¯况也要考虑到,测试的输出信o要详细易懂,表明各个功能的执行正确;•要求采用VisualC++6.0及以上版本进行调试。1.1.3设计思路–根据题目要求,用链表来实现大整数的存储,用大整数类Long_Num并实现一些基本操作,设计界面菜单类LN_menu来显示界面;然后,在main函数中来完成各种操作与检验。第二部分具体实现2.1.1链表类及大数类的部分说明以及部分源码链表类:List由使用指针连接的节点组成,每个节点都保存着数据,以及指向前驱和后继的指针。每个节点中存储一个数字表示大数的一位。源代码:node::node(){next=NULL;pre=NULL;}node::node(intp)//节点构造函数{value=p;next=NULL;pre=NULL;}大数类:大数类有一个头节点和尾节点,分别为head和back,而back的下一个节点为NULL。当head与back指向同一位置时表示List为只含一个节点。Head与back都为NULL表示List为空。而且用一个int类型的变量存储大数的长度,为以后的运算提供便利。构造函数:Long_Num::Long_Num()//构造函数{head=NULL;back=NULL;len=0;}•Long_Num()默认构造函数。voidLong_Num::equal(Long_Numtemp)//复制构造函数,将形参复制给当前对象,而非地址传递{node*p=temp.head;len=temp.len;head=newnode(p-value);back=head;p=p-next;while(p){node*Newnode=newnode(p-value);back-next=Newnode;Newnode-pre=back;back=back-next;p=p-next;}}•voidequal(Long_Numtemp)用equal代替了构造函数。2.1.2部分简单函数功能voidLong_Num::length()//更正对象长度并规范大整数{node*p=head;intn_len=0;while(p-next){if(p-value==0){p=p-next;head=head-next;head-pre=NULL;}elsebreak;}while(p){n_len++;p=p-next;}len=n_len;}•voidlength()把大整数运算过后前面的0去掉,并且更正len长度。boolLong_Num::equalto(Long_Numtemp)//判断两大整数是否相等{node*p1=head,*p2=temp.head;boolflag=true;while(flag&&p1){if(p1-value!=p2-value)flag=false;else{p1=p1-next;p2=p2-next;}}returnflag;}•voidequalto(Long_Numtemp)判断两大整数是否相等voidLong_Num::print()//打印十进制数并存储{if(head==NULL){cout******数据为空!********endl;}else{ofstreamoutfile;outfile.open(output_Num.txt,ios::app);node*p=head;while(p-next){if(p-value==0)p=p-next;elsebreak;}while(p){coutp-value;outfilep-value;p=p-next;}outfileendl;coutendl;}}•voidprint()打印并存储十进制数据。voidLong_Num::print2()//打印二进制数并存储数据{if(head==NULL){cout******数据为空!********endl;}else{ofstreamoutfile;outfile.open(output2_Num.txt,ios::app);node*p=head;while(p-next){if(p-value==0)p=p-next;elsebreak;}while(p){coutp-value;outfilep-value;p=p-next;}outfileendl;coutendl;}}•voidprint2()打印并存储二进制数据。boolLong_Num::compare(Long_Numtemp)//初级比较,只用于长度相等的大正间的比较,大于等于返回true{boolflag=false;node*temp1=head,*temp2=temp.head;while(temp1){if(temp1-value!=temp2-value){flag=temp1-valuetemp2-value?true:false;break;}else{temp1=temp1-next;temp2=temp2-next;}}if(!temp1)flag=true;returnflag;}boolLong_Num::compare2(Long_Numtemp)//升级版比较,可比较长度的大整数,大于等于返回true{if(lentemp.len)returntrue;else{if(len==temp.len)returncompare(temp);elsereturnfalse;}}•boolcompare(Long_Numtemp)都是实现两个大整数的比较。voidLong_Num::set_Long_Num(strings)//将输入的字符串转成大整数{intstr_len=s.length();head=newnode((int)s[0]-48);len++;back=head;if(str_len1){for(inti=1;istr_len;i++){node*Newnode=newnode((int)s[i]-48);len++;back-next=Newnode;Newnode-pre=back;back=back-next;}}length();}voidLong_Num::set_Long_Num2(inttemp)//建立大整数,将参数建立新节点加在尾部{node*Newnode=newnode(temp);if(back){back-next=Newnode;Newnode-pre=back;back=back-next;}else{head=Newnode;back=head;}len++;}•voidset_Long_Num(strings)创建大整数,把字符串的内容转为int赋给大整数。•voidset_Long_Num2(inttemp)如果当前大整数为空,则创建大整数,并把值赋给它,如果非空,则在后面添加节点,把值赋给节点。Long_NumLong_Num::sub_Num(Lon
本文标题:数据结构大型实验大整数运算系统(附源代码)
链接地址:https://www.777doc.com/doc-3871888 .html