- 1、本文档共67页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
长整数,高精度大数加减运算课程报告(c版)(附源代码)
华南理工大学高级语言程序设计 I 大作业报告实验题目: 长整数运算、高精度运算姓名: 李超悦 学号: 201230610155 班级: 网络工程 任课教师: 郑运平实验概述【实验目的及要求】?? 设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算术运算。要求:用动态链表存贮数据,每个结点含一个整型变量,表示若干位数。( 注:任何整型变量的范围是 -(231 -1)~(231 -1),任意长整数的整型变量的范围是-(2n -1)~(2n-1),在计算机上都能有效地运行。 其中,n是由程序读入的参数控制的。 )(2)整数输入和输出按中国对于长整数的习惯表示,每3位1组,组间用逗号隔开。(3)实现加、减运算。(4)程序运行界面清晰实用。【实验原理】 大整数的存储结构:?大数计算的因数和结果精度一般是少则数十位,多则几万位。在C++语言中定义的类型中精度最多只有二十多位,因而我们采取用链表存贮的方式来存放大数。在计算中会用到从高位开始计算,和从低位开始计算数值的两种情况。所以我们将链表定义为双向链表,其中为一个单元来存贮数据,一个指针指向前方的数据,另一个指向后的数据。程序的逻辑框图【实验环境】? VS2012 SP2,WIN8平台实验内容【实验方案设计】一、要求和规格的说明描述问题:设计一个程序实现两个任意长的整数(包括正数和负数)、任意精度实数的算术运算。要求:用动态链表存贮数据,每个结点含一个整型变量,表示若干位数。( 注:任何整型变量的范围是 -(231 -1)~(231 -1),任意长整数的整型变量的范围是-(2n -1)~(2n-1),在计算机上都能有效地运行。 其中,n是由程序读入的参数控制的。 )(2)整数输入和输出按中国对于长整数的习惯表示,每3位1组,组间用逗号隔开。(3)实现加、减运算。(4)程序运行界面清晰实用。二、设计设计思想:储结构:双向链表储存数据struct long_int//构建一个存储字符与地址的结构{ char num ; long_int *pro , *next ; };//在这里,用pro记录左链,用next记录右链原理:在C++语言中定义的类型中精度最多只有二十多位,因而我们采取用链表存贮的方式来存放大数。在计算中会用到从高位开始计算,和从低位开始计算数值的两种情况。所以我们将链表定义为双向链表,其中为一个单元来存贮数据,一个指针指向前方的数据,另一个指向后的数据。主要算法思想。A加法:先从低位算起,因为只须要对应的位相加,再加上前一位的进位,再去判断是否本位是否有进位, 有则把本位数字改为减去它的权,也就是10,再置进位为1。如果没有进位,则给进位赋值0。两个加数中那一个数的位数长,以位数长的作为循环变量;用ASCLL码值做判断;此处以一位为一储单元,实现进位,提高运算效率,再将数字三位一组加“,”,写入字符串,方便输出代码实现://加法运算string Plus ( long_int* num1 , long_int* num2 , long_int* num_1 , long_int* num_2 , int sign )//运行加法运算{int n , i=0 , k=0 ;//这里定义i为进位判断符号,k为间隔符判断符号long_int *s , *p , *q , *head = NULL ;//在这里,head只能算是指向小数点的标志了if ( num_1 || num_2 ){ s = new long_int ;//存储小数点的链s-num = . ;head = s ;p = s ;while ( num_1 || num_2 ){if ( k != 0 k % 3 == 0 )//k作为判断位数间隔,每3个位一个“,”{s = new long_int ;s-num = , ;p-next = s ;s-pro = p ;p = s ;}s = new long_int ;s-pro = p ; if ( num_1 == NULL || num_2 == NULL )//当其中一个数位数不够时的判断{if ( num_1 == NULL ) n = num_2-num ;else n = num_1-num ;}else n = num_1-num + num_2-num - 48 ;//因为运算的是ASCLL码,所以减去48,即重复的部分if( n 9 )//当ASCLL码超出57说明要进位了{n -= 10 ; q = s ;while( q-pro-num != . )//进位的判断,这里从高位加到低位,所以进位的时候得从低位到高位判断回去{if ( q-pro-num == , ) q = q-pro ;//发现间
文档评论(0)