高精度运算(C++)[定义.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
万进制高精度运算( C++语言) 目前在青少年信息学奥林匹克竞赛中所涉及到的高精度计算包括加 (addition) 、减 (subtract) 、乘 (multiply) 、除 (divide) 四种基本运算。其中 乘法分高精度数乘高精度数和单精度数乘高精度数 两种, 除法一般指两个单精度数相除 ,求解最终指定精度的解,找出循环节或输出指定精度位数的小数。 (注:高精度数与单精度数均指整数 ) 主要的解题思想是利用在小学就曾学习过的 竖式加减乘除法则 ,用程序语言实现存在的问题主要有 如何 存储高精度数的值 ,如何实现计算等问题。 一 . 高精度数字的存储 我们日常书写一个高精度数字,左侧为其高位,右侧为其低位,在计算中往往会因 进位( carry )或 借位( borrow )导致高位增长或减少 ,因此我们 定义一个整型数组( int bignum[maxlen] )从低位向高 位实现高精度整数的存储 ,数组的每个元素存储高精度数中的一位。(如下表所示) 高精度数 3 (高位) ,, 7 9 4 (低位) int bignum[i] n ,, 2 1 0 显然, 在 C++语言中, int 类型( 4 个字节 /32 位计算机)元素存储十进制的一位数字非常浪费空 间,并且运算量也非常大,因此常将程序代码优化为万进制, 即数组的每个元素存储高精数字的四位 。 在后面的叙述过程中均以万进制为例介绍。(为什么选择万进制,而不选择更大的进制呢?十万进制中 的最大值 99999 相乘时得到的值是 9999800001 超过 4 个字节 的存储范围而溢出,从而导致程序计算错 误。) 在实际编写程序代码过程中常作如下定义: const int base=10000; const int maxlen=1000+1; int bignum[maxlen]; 说明: base 表示进制为万进制, maxlen 表示高精度数的长度, 1 个元素能存储 4 个十进制位, 1000 个元 素就存储 4000 个十进制位, 而加 1 表示下标为 0 的元素另有它用,常用作存储当前高精度数字的位数。 二 . 各种运算的程序实现 (一)加法: 首先回顾一下小学中曾学习的竖式加法,见图一: bignum1[] 9475 46 1243 bignum2[] 918 1324 341 carry 1 0 0 0 bignum_ans[] 1 393 1370 1584 图一 加法的计算过程 从上面的图中我们可以得知,做加法运算是从低位向高位进行,如果有进位,下一位进行相加时要 加上进位,如果最高位已计算完还有进位,就要增加存储结果的位数,保存起进位来。关于进位的处 理,往往定义单独变量 carry 进行存储,程序实现的过程如图二所示: 初始化 进位 carry 赋初始值 0,结果的 位数为两个加数的 最大位数。 Y N 当前位超过最高 还有进位 位了? 么?

文档评论(0)

李亚亚 + 关注
实名认证
文档贡献者

liyaya

1亿VIP精品文档

相关文档