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

第三章 pascal算法讲义-第二讲.pdf

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
百度Pascal 吧公开培训教材-Pascal 培训课程算法讲义-第二讲 第二讲 预备算法 一、高精度算法 高精度,在OI 中是极为常见的一种运算极大数的算法。 高精度运算,是指参与运算的数(加数,减数,因子……)范围 大大超出了标准数据类型(longint 2^31,int64 2^63 等)能表示的范 围的运算。例如,求两个200 位的数的和。 这时,就要用到高精度算法了。 首先让我们来回忆一下小学时学习 的加减乘竖式,如图 高精度运算的原理就是以数组一位一位的储存两个操作数,模拟 各种竖式,最后得出用数组储存的结果数。 Part1.基础高精度 首先是高精度加法 其中a,b 是字符串类型的读入数,后接两个for 把他们转成数组 第1 页,共25 页 百度Pascal 吧公开培训教材-Pascal 培训课程算法讲义-第二讲 abn 和bbn。在数组中储存可以使用顺序或倒序,顺序的话进位的时 候会很难办,所以推荐使用倒序,就像这样 因为是倒序,所以这个数表示的就是3211 。 当然为了模块化我们可以把这个大数数组类型定义成一个新类 型 type bigint=array [0..max] of longint;// max 是可能的最大位数 知道了以上这些,那么高精度加法的基本规则也就很简单了 设c 为结果,a ,b 为操作数 c[i]=a[i]+b[i] 然而并没有这么简单,进位的问题也是需要考虑的 因为是十进制,c 中每一位只有可能是0~9 ,出现超过9 的很明 显需要进位。 Inc(c[i+1],c[i] div 10); c[i]:=c[i] mod 10; 这样就完成了这一位的进位操作:将整 10 送给高位,其余留下 来。 这样我们就得到了c 这一个结果,倒序输出即可。 最后我们还得考虑最高位是否有进位,如最高位进位了那么结果 的长度应该+1 高精度减法和高精度加法的规则是非常相似的 (c[i]=a[i]-b[i],设a 为被减数b 为减数),这里就不再阐述了。 第2 页,共25 页 百度Pascal 吧公开培训教材-Pascal 培训课程算法讲义-第二讲 Ww 与ff 为被减数与减数, L1 为最终结果长度 主要讲一下借位的问题: 当a[i]b[i]时,很明显是不够减的。那么我们就要在a 的上一位 中借出一位 dec(a[i+1]);inc(a[i],10); 这样就够减了,请读者自己思考 为什么。 至于高精度乘法呢,观察一下竖式规律即可得到,a,b 中每两位 都要互相乘,a[i]*b[j]最终是要加到c[i+j-1]这个位。 第3 页,共25 页 百度Pascal 吧公开培训教材-Pascal 培训课程算法讲义-第二讲 这样的话最后就处理一下c 的进位问题,然后输出即可。 c 的长度请读者自己思考。 高精度除法难度不大,却较为复杂,鉴于其编写调试均需很长时 间,在竞赛范围不可能出现,故这里不做详细讨论。有兴趣的同学可 以自己试试编写。 Part2.时间复杂度分析 加法减法自然就是O(len); 乘法O(lena*lenb) Div 和mod 也是特别慢的 假如有两个1 万位的大数相乘,时间就要接近1s,这么大的 时间开销对于一般题目来说是无法承受的,so 时间超限。 所以我们就要对他们做上一些优化 Part3.压位 用数组储存高精度数,一个能存9 位数的longint 只存一位 数是不是有点浪费呢? 现在我们就让longint 存下4 位数。 (即把longint 当成一个10000进制数) 如果存5 位的话就有可能会215 爆掉,请读者自己

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档