网站大量收购独家精品文档,联系QQ:2885784924

高精度整数问题.pptVIP

  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
高精度整数问题

高精度整数问题 组合数和Catalan的精确计算 问题描述 编一个大整数模板类,用来做高精度整数(也就是任意位数的整数)的四则运算,包括 加法(addition) 减法(subtraction) 乘法(multiplication) 除法(division) 利用上面设计的大整数模板类精确地计算组合数和Catalan数。 大整数的介绍 在某些情况下(如数据加密和科学计算等方面),我们要处理很大的整数,它无法在计算机硬件能直接表示的范围内进行处理。若用浮点数来表示它,则只能近似地表示它的大小,计算结果中的有效数字也受到限制(如C++中的Double类型有效位只有15位) 。若要精确地表示大整数并在计算结果中要求精确地得到所有位数上的数字,就必须用软件的方法来实现大整数的算术运算。 需要解决的问题 大整数的表示 在利于编程实现,同时便于提高运算效率的基础上选择数据结构。这个主要是考查数据结构。我们将会发现,在数据结构上的一个小改进对效率的提高有时会有很大帮助的。而数据结构在一定程度上是可以弥补算法的不足的。 大整数的运算 利用所选的数据结构,正确、高效地实现整数的四则运算。这主要考查算法。我们可以看到算法的选择对程序的效率是有绝对影响的。算法是决定程序效率的根本。 大整数的表示 由于大整数的位数太多,我们首先要做的是把它“拆”开来,放在若干个地方,然后建立不同存储地址之间的联系。很明显,线性数组(或者说是线性表)是首选。下面的存储方式很直观也是最容易想到的。 对于大整数1112223334445 我们可以用一维数组来表示: 数组下标: 存储数据: 大整数的表示 但我们可以发现这种表示方法的一个不足之处: 计算这个大整数加上9000000000000的结 果。如果用前面的方式存储,我们会发现进位没有 地方存放了。 数组下标: 大整数一: 大整数二: 结果: 1 为什么会出现这种情况?原因在于我们把大整数的 高位存放在数组的下标小的位置。而解决这个问题 的方法也很简单,就是把整数反过来存放。 大整数的表示 另一种表示方式 数组下标: 大整数一: 大整数二: 结果: 1 其实前一种表示方法还会有一个问题。就是高位的对 齐,这个我们可以通过减法观察到,这里就不说了。 基于以上原因,我们采用线性数组,同时把高位存放 在下标大的地方。虽然这样子存放我们看起来不那 么直观,但后面我们会看到这种存放方式的好处。 高精度加法运算 在确立了使用线性数组表示的大前提后,我们可以很容易地解决高精度加法。(这里为了简便,我就不用类实现了,同时假设那两个大整数都为正数。) 1.初始化数组,数组全部元素置为0 2.用字符串读入大整数,同时以反向存储的方式 存放在数组中 3.进位标志flag置为0。从数组低位开始进行加 法运算。这里只要注意flag的更新就行了。 4.反向输出结果 高精度加法运算 高精度加法举例 这里我们假设我们已读入两个大整数,并且也已经被分别反向存放在数组a和数组b中了。 加数a 8 7 4 2 5 9 7 80 0 加数b 4 8 3 1 4 8 5 1 9 0 结果c 2 6 8 3 9 7 3 00 1 进位e 1 1 0 0 0 1 1 1 1 0 上面的过程表示为915841384=1003793862 减法亦可用相同的方法实现,只是现在标志换成借 位标记而已。 高精度加、减法小结及其改进 我们首先要明确的一点是,选择线性数组及反向存 储的方式并不是偶然的。我们可以列一个竖式,用 手工模拟854+87的加法就会理解为什么要这样子 处理了。 而我们同时会发现,一个数组元素只存储一个位的 方式有点浪费,虽然这很合乎我们的习惯。但可不 可以通过增加存储位数的方法来提高效率呢?毕竟 我们需要的这个一个位计算机只要4个二进制位就可 以表示了,而VC给我们分配的一个int却有32 位。 大整数的运算之加、减法的改进 我们来分析只存储一个位的大整数加法是怎样进行 的。 加数a 8 7 4 2 5 9 7 80 0 加数b 4 8 3 1 4 8 5 1 9 0 结果c 2 6 8 3 9 7 3 00 1 进位e 1 1 0 0 0 1 1 1 1 0 设i表示数组第i位数,则 c[i] = (a[i] + b[i] + e) % 10; e = (a[i] + b[i] + e) / 10; 大整数的运算之加、减法的改进 所以我们如果要进行多位存储的话,我们只要把上 面的计算式子改成 c[i] = (a

文档评论(0)

118books + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档