版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、( 此文档为 word 格式,下载后您可任意编辑修改!)韶关学院计算机科学学院数据结构课程设计题目:课堂经验值查询系统学生姓名:吕功名专业:计算机科学与技术班级: 11 级( 1)班指导教师姓名及职称:陈正铭讲师起止时间:2013 年 2 月2013 年 4 月- 0 -1 需求分析1.1课题背景及意义随着计算机网络技术的发展和因特网的广泛普及,网络安全事故逐年增加,黑客的攻击已经和病毒并列成为对信息安全影响最严重的两大危害。其很大程度上是被黑客破解了用户的计算机名及登陆密码及资料的加密较差,而使得黑客来对网民的资料如同自己般的随意更改和破坏。而安全的密码和账号成为了网民的安全之本,怎么才能提
2、高安全问题成为的人们和社会关注的问题。而加密大部又是以大素数的计算为基础的,如非对称密码体制 RSA的安全性依赖于对大数进行因数分解的耗时性。大数运算不仅仅运用在密码学中,还运用在一些物理学研究、生物学,化学等科目中。大数运算,意味着参加的值和计算结果通常是上百位数,上千位数以及更大长度之间的整数运算。例如大家所熟知圆周率 的值,在一般的数值计算中用到圆周率的不须要多大的精度,但在计算一些星球或是星系上的体积面积时便显的误差很大了,这就要求 值计算的精度达到几百万位甚至更高,才能缩小误差。人工计算是远远不行了,而且本身误差也无法估计。只有在计算机中用大数运算求 值了。又如,考古学家计算石头内的
3、碳元素衰变来考证地球形成的时间,更是将计算的结果精确到了百年以内。所以说大数的运算是涉及领域多,应用范广,与我们生活息息相关。数据结构课程设计是一门实践性的计算机课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。通过这次课程设计,要求掌握较大程序的设计方法,相应数据结构的选择应用、算法的设计及其实现和性能分析等方面中加深对课程基本内容的理解。同时,在设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。1.2课题要求A. 支持大数精确运算的计算器B. 实现一个大数(要求允许绝对值 >10128)的计算器图形化程序软件。C. 要求程序读入大数 A 和 B,选择
4、相应的加、减、乘或除法运算符,然后计算精确结果(不能用科学计数法,不四舍五入)并输出到屏幕上,在普通计算机上运算时间不超过1 分钟。D. 选做内容:实现大数的其他运算(如三角函数),求出运算时间。1.3软件格式规定A输入的形式 : 正数的不用输入符号位,数值的第一位可以为零。位数在01000 之间B. 程序所能达到的功能: 能进行位数在01000(可在源程序里设置位数大小)之间的所有整型数和浮点型数的四则运算。C.输出的形式 : 是整型或浮点型数据D.测试的数据:1) 、正确的输入:以下是对两个大数进行加减乘除四则运算所得的正确结果:正确的运算结果:2) 、windows 版本应用程序错误的输
5、入 :数A: 112 数B:01.4设计目标A. 软件名称:大数运算器B. 软件组成: DosBigMath.exe ( dos 系统应用程序) ; WinBigMath.exe( windows 系统图形化窗口操作界面应用程序)C. 制作平台及相关调试工具: Win32 ;MicrosoftVisuslC+2005 ExpressD. 运行环境: doswinxpwin7E. 性能特点:(1)软件由两个可执行文件组成,各具特点:DosBigMath.exe 为 dos 系统应用程序,体积小,高效快捷,适用范围广,兼容性好。WinBigMath.exe 为 windows 应用程序,界面友好,
6、使用方便。( 2)输入的大数可为整型,也可以是浮点型。( 3)DosBigMath.exe ( dos 系统应用程序)的输入和输出形式:运算符选择按回车键输入 A 的值按回车键再输入 B 的值按回车键输出运算结果并显示运算所花时间( ms级)。( 4)WinBigMath.exe ( windows 应用程序)可支持鼠标点击输入与键盘输入,可支持黏贴的数字。( 5)运行时间较短,精确到毫秒级。( 6)个别其他功能可进行再扩展。2 概要设计2.1 问题解决的思路概述首先是确定结构化程序设计的流程图,利用已存在的数据结构来构造一个存储大数的结构,接着把四则运算分成四个主要的模块:实现加法的模块、实
7、现减法的模块、实现乘法的模块、实现除法的模块,然后各个模块里面还要分成若干种情况来考虑并通过函数的嵌套调用来实现其功能。最后,编写main 主函数以实现大整数的正确输入与正确输出,调试程序并将不足的地方加以修改。总而言之,就是先用自顶向下、逐步细化的设计方法来分析并画出程序设计流程图;然后用自下而上、逐步积累的设计方法来写出程序。2.2相关函数介绍说明在 dos 版本程序和 windows 版本程序下都定义了一个用于存储大数的结构体类型变量:typedefstructtagBigNum BigNum;( 1) dos 版本程序下定义的相关函数void StartCount();计时开始void
8、 EndCount();计时结束double Time();返回时差void InitBigNumToZero(BigNum *pNum);初始化 BigNum为0intCharLenByBigNum(CONST BigNum* pNum);判断需要多少个字符空间存储 BigNum转换的字符串 . void CharToBigNum(CONSTchar *arr,BigNum *pNum);从字符串转换到 BigNum.void BigNumToChar(char *szBuf,CONST BigNum *pNum);从BigNum转换到字符串 .void AdjustBits(BigNum
9、*pNum);调节数位 , 删除最高整数位是的和最低小数位是的数位.void MoveFloatPoint(BigNum *pNum,intdeta);移动小数点 ,deta=0 不移动 ,deta<0 往左移动 ,deta>0 往右移动 .void MakeInfinite(BigNum *pNum);使无穷大char *Result(CONSTchar *val1,CONST char *val2,PFNCALC pfnCalc);根据算术函数返回结果int Compare(CONST BigNum* pn1,CONST BigNum* pn2); 比较个数大小 int IsZ
10、ero(CONST BigNum *pNum); 判断是否为void Add(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);加法void Mul(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);乘法void Sub(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);减法void Div(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);除法void showmenu(); 显示菜单信息voi
11、d menu(); 选择运算符的菜单void GetNum(CHARARR numa,CHARARR numb);从dos界面获取输入字符串( 2) windows 版本程序下定义的相关函数windows 版本程序下定义的相关函数中除了没有“void showmenu(); ”“、 voidmenu(); ”、“ void GetNum(CHARARR numa,CHARARR numb);”三个 dos 输入显示函数,其他的函数都和dos 版本程序下定义的一样。2.3主程序的流程基函数调用说明在这里,主程序的流程以dos 版本程序进行说明。( 1)主程序的简要流程图图 1 主程序流程图( 2
12、)各程序模块之间的层次(调用)关系1调用“ Result( ) ”函数,以调用“ CharToBigNum( ) ”将输入的字符型大数转换成可用于运算的结构体类型大数,然后调用四则运算的各运算模块进行相应的运算,再调用“ BigNumToChar( ) ”将各运算模块返回的运算结果转换成字符类型用于输出显示,期间还要调用“ CharLenByBigNum( ) ”来判断数据所需的存取空间。2在每一个运算模块都涉及到大数的存取,所以都要调用“ InitBigNumToZero( ) ”对结构体变量初始化。3 加法运算程序模块“ Add( ) ”,首先要判断两个大数的符号位,如果是一号相加则调用减
13、法运算程序“Sub( ) ”;如果是同号相加则直接运行程序。4减法运算程序模块“ Sub( ) ”,首先要判断两个大数的符号位,如果是异号相减则调用加法程序“Add( ) ”;如果是同号相减则直接运行,然后调用“ Compare( ) ”以实现大数减小数。5 乘法运算程序模块“Mul( ) ”,首先调用“ MoveFloatPoint( )”以实现浮点型数以整型数的形式相乘,采用“模拟笔算”的方法,每乘一次都要调用加法程序“ Add( ) ”将结果累加起来,然后在调用“MoveFloatPoint( )”将所得的整型结果转化成正确的浮点型类型相乘结果。6 除法运算模块“ Div( )”,首先调
14、用“ MoveFloatPoint( )”以实现浮点型数以整型数的形式相除,采用“模拟笔算”的方法,以除数的位数长度为基准,多次循环调用“Compare( ) ”、“MoveFloatPoint() ”、“ Mul( ) ”和“ Sub( ) ”,一直到规定的小数位数为止,最终还要要调用“MoveFloatPoint( )”将所得的整型结果转化成对应的浮点型类型相除结果。3 详细设计3.1数字存储的实现大数计算的因数和结果精度一般是少则数十位,多则几万位。在C 语言中定义的类型中精度最多只有二十多位,由于涉及到浮点型大数和负数的运算,因而程序采取定义一个结构体类型存贮的方式来存放大数符号、小数
15、点、整数部分、整数数位、小数部分、小数有效位数。在计算中会用到从高位开始计算,和从低位开始计算数值的两种情况。其结构为:typedefstructtagBigNum intintbits;整数数位intfloatbits;小数有效数位char infinite;无穷大char sign;符号char intpartINT_BIT_MAX;char floatpartFLOAT_BIT_MAX; BigNum;整数部分小数部分3.2四则运算算法在大数四则运算的程序设计中,每一部分都会调用一些其他其它函数来辅助完成运算(例如:对结构体变量的初始化,比较两个数的大小, 将字符型数据转换成结构体类型数
16、据和将结构体类型数据转换成字符型数据等),在这里主要说明四则运算的程序设计,其它函数的程序设计和具体调用关系请查看程序清单。加法运算的实现加法计算还是比较容易实现的,对于整数部分的计算,以整数部分位数长的作为循环变量, 先从低位算起, 因为只须要对应的位相加 (相加结果小于20),再加上前一位的进位,再判断本位是否有进位,把进位值改为本位除以它的权(也就是10)取整(既有进位时,给进位赋值1,如果没有进位,则给进位赋值 0),然后把本位数字改为本位除以它的权(也就是10)取余。图 2 加法运算原理图对于加法运算中小数部分的计算,也是从低位算起,以小数部分位数长作为循环变量,相加的原理跟整数部分
17、一样。在程序中设计时应注意:1以上加法运算的原理只针对两个符号位相同的大数相加,如果是异号相加则要调用减法运算模块;2 结束循环时,不仅仅是最后一位加完就停止,还应加入如果有进位,也要再循环一次。如最后一位是9,进位是 1,则相加时进位,要加上进位这一位值。具体看代码。3 如果是两个负数相加,最终结果还要加负号。减法运算的实现由于使用结构体类型来分别存储了大数的整数及其位数、小数及其位数、符号(正、负),所以对于减法运算的实现也是比较简单的。对于整部部分,算法从低位开始减。首先判断两个数是否相等,如果相等则直接返回结果位0;否则要判断减数和被减数那一个位数长,被减数位数长是正常减;减数位数长,
18、则减数减被减数,最后还要加上负号。两数位数长度相等时,比较哪一个数大,被数大则正常减;减数数大则减数减被减数。处理每一项时,如果前一位相减有借位,就先减去上一位的借位,无则不减,再去判断是否能够减开被减数,如果减不开,就要借位后再去减,同时置借位为1,否则置借位为0。图 3 减法运算原理图对于减法运算中小数部分的计算,也是从低位算起,减法原理跟整数部分一样。在程序设计时应注意:1 两个浮点型数的减法运算是从小数部分开始的,当小数部分计算完了才开始计算整数部分;而计算整数部分的时候还要判断小数部分的计算是否有向整数部分借位。2 以上减法运算的原理只针对两个符号位相同的大数相减,如果是异号相减则要
19、调用加法运算模块。乘法运算的实现首先说一下乘法计算的算法,从低位向高位乘,在竖式计算中,我们是将乘数第一位与被乘数的每一位相乘,记录结果,之后,用第二位相乘,记录结果并 且左移一位,以此类推,直到计算完最后一位,再将各项结果相加。得出最后结果。当然我们可以直接用这种方法,但要用多个结构体变量来保存计算出的分结果,之后结果再相加得到最后结果,但是这样会浪费很多空间;因此,可以再优化一下,就是只用两个结构体变量来表示结果,先把第一位乘数与被乘数的结果保存在第一个结构体变量中,然后将此次分结果与第二个结构体变量中的数相加并将结果保存于第二个结构体变量中;在进行下一次相乘,第二位乘数与被乘数结果存在第
20、一个结构体变量中,再与第二个结构体变量中保留的累加结果相加。以此类推,直到结束。这样就可以用两个结构体变量来存储相乘后的结果并节省了一些空间。图 4 乘法运算原理图在程序设计时应注意:1两个浮点型数的乘法运算是先将浮点型数转换成整型数,再从低位开始计算,当计算完后了还要将整型结果转换成浮点型结果。2 两个异号大数相乘时,结果要加上负号。3将各分结果相加时,直接调用加法运算函数即可。除法运算的实现首先次除法运算所要得到的结果,当被除数除不开除数时,被除数补零继续向下除,一直除到规定的小数位数。从高位向低位减,减时以被除数长度为单位,从高位取出大于被除数的字符串(被除数),然后将原除数乘以一个权值
21、(小于10)得到一个不大于被除数的新的被除数,再用被除数减去新的除数,权值既为结果,余数从剩下的被除数高位再取出几位做补位,如此类推,循环减。最终,将相应的小数结果返回。图 5 除法运算原理图在程序设计时应注意 :1上述除法原理是从两个整型数相除的角度来说明的。当两个大数中有浮点型数时,要先将小数转换成整数再进行除法运算,运算完毕后,还要将最后的结果转换成相对应得小数结果。2减数(亦即除数)乘上一个权值后不能大于被减数(亦即被除数)。3乘以一个权值时,可直接调用乘法运算函数即可;循环相减时,可直接调用减法运算函数即可。3.3函数调用关系图此函数调用关系图以 dos 版本应用程序来进行说明。此函
22、数调用关系图主要描述了四则运算的实现及实现各运算所要调用的函数,详情还请看程序清单。图 6 函数调用关系图4 调试分析表 1 调试过程情况表序时间出现问题号1做减法时由于没有考虑到 a<b 的情况,出现了输出结果错误的情况2减法输出结果中测试到,当高位的值相减为0 时,也是把 0 给输出3乘法运算编程算法是逐个转化为数字, 进行整型运算,结果存储很麻烦,需要多次进行加法运算,还要进行移位运算,使数字的相加位一致。4乘法结果 c 的存储大小没考虑到最大的进位,只是考虑了最高的进位不大于 9,没有考虑到进位大于 10 的情况,导致溢出位没有输出,结果错误。5对于除法,结果输出的时候也是遇到了
23、与减法运算时,没有清零的情况6除法参考别人的算法,发现当输入的大整数a<b 时,商为空7一次输入两个大整数只能运算一次,发现很麻烦8可以重复输入下一次的大整数,但是屏幕上的东西太多了,但是一次清理就会使屏幕清空,不能做下一次的运解决方法将减法分成三部分,a>b,a<b,a=b, 做 a<b 时将 a 和 b 互换,执行 a>b 时的操作, a=b 时就直接输出 0存储数组c,用一个for语句,if(ci!=0)break;到第一个非0开始,将后面的字符串逐个输出 cout<<ci;可以这样做乘法,先将每一位上有的每一个数字相乘在相加,求模作为那一位的数
24、字再转化为字符,求整除则将结果加到高一位的结果中,如此循环,直到最后一位,并存到 c 中。(运算方法在详细设计的乘法中给出。 )对于乘法的进位,最大的不会超过 99,但有会有超过 10 的情况,所以存放结果的 c 的大小应该为两个大整数的个数的和加上 2,当进位没达到 c0 时,则将这些位置为 0 ,在进行结果输出。参考减法运算的算法,将商的无效的 0将除法的情况也分为两种:a>=b,a<b;当 a<b 时将商赋值为 0,然后将 a 作为余数也一并输出。用 for 语句将四个运算符加入里面,用第二次输入来判断运算,只有当运算符不是四个中的一个时才跳出到下一次运算输入。用一个
25、while (1)一个永真语句进入一个循环,在循环的开始就设置清屏语句 system("cls"); 然后输入是否选择是否进入计算系统,不进入的话就跳出循环,结算。束执行。9在输入运算选择符时用 getch()输入就没出现内存问一开始用了 scanf (), 题,但是同时使用者也不知道自发现会导致内存己输入的是什么选择符,再使用written 出错一个 pirntf (),将输入的字符显示出来。10在输入大整数运算后,将输入的两个数再次初始化,复进入到多重运算符多制到另外的两个数组中,并显示次操作的时候,结果会出来运算的两个数,发现没有问出现乱码。题了。11再进行结果的测试
26、的询问了别人,原来不但要将进行过程中又再次出现结计算的两个数进行初始化,还要果为乱码的情况。将存储结果的数组 c 一并清空,将 ci 的每一位都赋值为空。5 用户使用说明分两部分来分别说明dos 版本应用程序的操作和windows 版本应用程序的操作:5.1 dos版本应用程序操作说明(1)运行 DosBigMath.exe 应用程序后会出现主界面;(2)选择所要做的运算,按下回车键;( 3)输入第一个操作数,按下回车界;( 4)再输入第二个操作数,按下回车,显示结果。5.2 windows 版本应用程序操作说明(1)运行 WinBigMath.exe 应用程序后会出现主界面:图 7 主界面效
27、果图图 8 运行效果图(2)按下数字键( 09)在输入框A 中输入第一个大数,如果发现按错数字键可按“退格”键从后往前一个一个地删除;然后按下“+”“- ”“ * ”“”键,自动切换到 B 输入框,按下数字键( 09)输入第二个大数 ,同样,如果发现按错数字键可按“退格”键从后往前一个一个地删除;最后按下“=”键,输出显示运算结果并显示运算时间;( 3)如果在按下运算符按键后发现第一个输入有错,则可再按一次同样的运算符按键,就自动切换到输入框 A,这是按下“退格”键可从后往前一个一个地删除。6 测试结果6.1 dos版本应用程序测试结果:图 9 dos 版本测试结果图6.2 windows 版
28、本应用程序测试结果:图 10 windows 版本测试结果图参考文献1 陈元春,王中华等 . 实用数据结构 M. 北京:中国铁道出版社, 2003.18-40.附录:程序清单本程序设计由三部分组成(“ BigMath.c”,“ BigMath.c ” ):* BigMath.;char intpartINT_BIT_MAX;char floatpartFLOAT_BIT_MAX;符号整数部分小数部分 BigNum;算术函数指针类型.typedefvoid(*PFNCALC)(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);计时开始void S
29、tartCount();计时结束void EndCount() ;返回时差floatTime();初始化 BigNum为 .void InitBigNumToZero(BigNum *pNum);判断需要多少个字符空间存储BigNum转换的字符串.intCharLenByBigNum(CONST BigNum* pNum);从字符串转换到BigNum.void CharToBigNum(CONST char *arr,BigNum *pNum);从 BigNum转换到字符串 .void BigNumToChar( char *szBuf,CONST BigNum *pNum);调节数位 , 删
30、除最高整数位是0的和最低小数位是0的数位 .void AdjustBits(BigNum *pNum);移动小数点 ,deta=0 不移动 ,deta<0 往左移动 ,deta>0 往右移动 .void MoveFloatPoint(BigNum *pNum,intdeta);使无穷大void MakeInfinite(BigNum *pNum);根据算术函数返回结果char *Result(CONSTchar *val1,CONSTchar *val2,PFNCALC pfnCalc);比较个数大小intCompare(CONST BigNum* pn1,CONST BigNum
31、* pn2);判断是否为intIsZero(CONST BigNum *pNum);加法void Add(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);乘法void Mul(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);减法void Sub(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);除法void Div(CONST BigNum* pn1,CONST BigNum* pn2,BigNum* pRes);#endif AFX_BIG
32、MATH_H_FC9C727A_5204_4798_9686_0CC00C25729C_INCLUDED_ * BigMath.c: implementation*#include <stdio. (TimeEnd.QuadPart-TimeStart.QuadPart)*1000Freq; 返回时差void InitBigNumToZero(BigNum *pNum)初始化BigNum为memset(pNum,0, sizeof(BigNum);void AdjustBits(BigNum *pNum)调节数位 , 删除最高整数位是0的和最低小数位是0的数位 .while (pNum-
33、>intbits>1&&pNum->intpartpNum->intbits-1=0)pNum->intbits-;while (pNum->floatbits>1&&pNum->floatpartpNum->floatbits-1=0)pNum->floatbits-;voidMoveFloatPoint(BigNum*pNum,intdeta)deta<0则往左移动小数点,deta>0则向右移动小数点if (deta)BigNum n=*pNum;InitBigNumToZero(pNu
34、m);pNum->sign=n.sign;if (deta<0)inti;deta=-deta;for (i=deta;i<bits;i+)pNum->intpartpNum->intbits+=parti;for (i=deta-1;i>=0;i-)pNum->floatpartpNum->floatbits+=parti;for (i=0;i<n.floatbits;i+)pNum->floatpartpNum->floatbits+=n.floatparti;elseinti;for (i=d
35、eta;i<n.floatbits;i+)处理小数部分pNum->floatpartpNum->floatbits+=n.floatparti;for (i=deta-1;i>=0;i-)小数到整数的部分pNum->intpartpNum->intbits+=n.floatparti;for (i=0;i<bits;i+)整数部分pNum->intpartpNum->intbits+=parti;AdjustBits(pNum);intCharLenByBigNum(CONST BigNum* pNum)判断需要多少个字
36、符空间存储BigNum转换的字符串 .intlen = pNum->floatbits+pNum->intbits+1;if(pNum->intbits=0) len+;.1 -> 0.1if(pNum->floatbits) len+;'.'if(pNum->sign) len+;'-'if(pNum->infinite)return 11;#INFINITEreturnlen;void CharToBigNum(CONST char *arr,BigNum *pNum)从字符串转换到BigNum.char *poin
37、t;InitBigNumToZero(pNum);if (*arr='-')如果是负数arr+;pNum->sign=1;point=strchr(arr,'.');if (point)找到小数点intn=pNum->intbits=point-arr;while (n)整数数位不 =0则循环计算出整数数位pNum->intpartpNum->intbits-n=arrn-1-'0' ;将数字低位存在低下标元素n-;while (*+point)pNum->floatpartpNum->floatbits=*p
38、oint-'0' ;pNum->floatbits+;else说明没写小数点, 全是整数.intn=pNum->intbits=strlen(arr);while (n)pNum->intpartpNum->intbits-n=arrn-1-n-;'0' ;AdjustBits(pNum);处理 -0和的情况if (pNum->floatbits=0)if (pNum->intbits=0 | pNum->intbits=1&&pNum->intpart0=0)pNum->sign=0;voi
39、d BigNumToChar( char *szBuf,CONST BigNum* pNum)从 BigNum转换到字符串.intn=pNum->intbits,c;memset(szBuf,0,CharLenByBigNum(pNum);if (pNum->sign)如果是负数*szBuf+= '-'if (pNum->infinite)strcat(szBuf,return;"#INFINITE");while (n)szBufpNum->intbits-n=pNum->intpartn-1+ n-;'0'
40、;c=0;是否加了if (pNum->intbits=0) strcat(szBuf,c=1;"0" );if (pNum->floatbits) strcat(szBuf,n=0;while (n<pNum->floatbits)"." );szBufpNum->intbits+1+n+c=pNum->floatpartn+'0'n+;char *Result(CONSTchar *val1,CONSTchar *val2,PFNCALC pfnCalc)根据算术函数返回结果staticchar *s
41、_szRes=NULL;BigNum n1,n2,res;if (s_szRes) delete s_szRes;free(s_szRes);s_szRes=NULL;CharToBigNum(val1,&n1);CharToBigNum(val2,&n2);pfnCalc(&n1,&n2,&res);s_szRes = new charCharArrLenByBigNum(&res);s_szRes=( char *)malloc(CharLenByBigNum(&res)* sizeof ( char ); BigNumToChar(
42、s_szRes,&res);returns_szRes;intCompare(CONST BigNum* pn1,CONST BigNum* pn2)比较个数大小首先是比较符号if (pn1->sign=0&&pn2->sign!=0)pn1是正数,pn2 是负数return1;>elseif (pn1->sign!=0&&pn2->sign=0)pn1 是负数 ,pn2是正数return-1;<else同号状态比较整数部分if (pn1->intbits>pn2->intbits)returnpn1
43、->sign?-1:1;pn1 整数数位多elseif (pn1->intbits<pn2->intbits)returnpn1->sign?1:-1;else整数数位相同inti=pn1->intbits-1;指到最高位while (i>=0)if (pn1->intparti>pn2->intparti)returnpn1->sign?-1:1;elseif (pn1->intparti<pn2->intparti)returnpn1->sign?1:-1;else i-;整数部分相同, 比较小数部分
44、for (i=0;i<pn1->floatbits&&i<pn2->floatbits;)if (pn1->floatparti>pn2->floatparti)returnpn1->sign?-1:1;elseif (pn1->floatparti<pn2->floatparti)returnpn1->sign?1:-1;else i+;if (i<pn1->floatbits)if (i<pn2->floatbits)return0;相等returnreturnpn1->s
45、ign?-1:1;pn1->sign?1:-1;void MakeInfinite(BigNum *pNum)使无穷大pNum->infinite=1;intIsZero(CONST BigNum* pNum)判断是否为if (pNum->floatbits=0&&pNum->intbits=0)return1;if (pNum->floatbits=0&&pNum->intbits=1&&pNum->intpart0=0)return1;return0;void Add(CONST BigNum* pn
46、1,CONST BigNum* pn2,BigNum* pRes)加法InitBigNumToZero(pRes);if (pn1->signpn2->sign)异号BigNum n2=*pn2;n2.sign=pn1->sign;Sub(pn1,&n2,pRes);else同号intmaxfloatbits=pn1->floatbits>pn2->floatbits?pn1->floatbits:pn2->floatbits;intaddbit=0;进位值inti,j;StartCount();计时开始for (i=maxfloatbi
47、ts-1;i>=0;i-)intvalue=pn1->floatparti+pn2->floatparti+addbit;addbit=value10;看看是否超过.设置进位值pRes->floatparti=value%10;pRes->floatbits=maxfloatbits;到此 , 小数部分计算完毕.for (j=0;j<pn1->intbits|j<pn2->intbits;j+)整数部分相加intvalue=pn1->intpartj+pn2->intpartj+addbit;addbit=value10;pRes->intpartj=value%10;pRes-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版监控设备销售与维护保养合同3篇
- 二零二五年度果树种植与农业科研合作承包合同2篇
- 二零二五版建筑工地场地勘查与风险评估委托合同3篇
- 二零二五版国际机场ATM设备场地租赁与广告合作合同3篇
- 二零二五版矿业勘探承包作业合同样本2篇
- 二零二五版智能停车场设计与施工合同3篇
- 二零二五版板房租赁合同附带设施设备维修协议3篇
- 二零二五版抵押房屋买卖合同与房屋保险服务合同3篇
- 二零二五版办公场地租赁与人力资源服务合同范本3篇
- 二零二五版鸡蛋养殖基地技术改造合同3篇
- 广东省佛山市2025届高三高中教学质量检测 (一)化学试题(含答案)
- 《国有控股上市公司高管薪酬的管控研究》
- 餐饮业环境保护管理方案
- 人教版【初中数学】知识点总结-全面+九年级上册数学全册教案
- 食品安全分享
- 矿山机械设备安全管理制度
- 计算机等级考试二级WPS Office高级应用与设计试题及答案指导(2025年)
- 造价框架协议合同范例
- 糖尿病肢端坏疽
- 心衰患者的个案护理
- 医护人员礼仪培训
评论
0/150
提交评论