求N!的高精度算法求N!的高精度算法.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
求N!的高精度算法求N!的高精度算法

求N!的高精度算法 本文中的算法主要针对Pascal语言 这篇文章的内容 你了解高精度吗? 你曾经使用过哪些数据结构? 你仔细思考过如何优化算法吗? 关于高精度 Pascal中的标准整数类型 高精度算法的基本思想 Pascal中的标准整数类型 高精度算法的基本思想 Pascal中的标准整数类型最多只能处理在-263~263之间的整数。如果要支持更大的整数运算,就需要使用高精度 高精度算法的基本思想,就是将无法直接处理的大整数,分割成若干可以直接处理的小整数段,把对大整数的处理转化为对这些小整数段的处理 数据结构的选择 每个小整数段保留尽量多的位 使用Comp类型 采用二进制表示法 每个小整数段保留尽量多的位 一个例子:计算两个15位数的和 方法一 分为15个小整数段,每段都是1位数,需要15次1位数加法 方法二 分为5个小整数段,每段都是3位数,需要5次3位数加法 方法三 Comp类型可以直接处理15位的整数,故1次加法就可以了 比较 用Integer计算1位数的加法和3位数的加法是一样快的 故方法二比方法一效率高 虽然对Comp的操作要比Integer慢,但加法次数却大大减少 实践证明,方法三比方法二更快 使用Comp类型 高精度运算中,每个小整数段可以用Comp类型表示 Comp有效数位为19~20位 求两个高精度数的和,每个整数段可以保留17位 求高精度数与不超过m位整数的积,每个整数段可以保留18–m位 求两个高精度数的积,每个整数段可以保留9位 如果每个小整数段保留k位十进制数,实际上可以认为其只保存了1位10k进制数,简称为高进制数 ,称1位高进制数为单精度数 采用二进制表示法 采用二进制表示,运算过程中时空效率都会有所提高,但题目一般需要以十进制输出结果,所以还要一个很耗时的进制转换过程。因此这种方法竞赛中一般不采用,也不在本文讨论之列 算法的优化 高精度乘法的复杂度分析 连乘的复杂度分析 设置缓存 分解质因数求阶乘 二分法求乘幂 分解质因数后的调整 高精度乘法的复杂度分析 计算n位高进制数与m位高进制数的积 需要n*m次乘法 积可能是n+m–1或n+m位高进制数 连乘的复杂度分析(1) 一个例子:计算5*6*7*8 方法一:顺序连乘 5*6=30,1*1=1次乘法 30*7=210,2*1=2次乘法 210*8=1680,3*1=3次乘法 方法二:非顺序连乘 5*6=30,1*1=1次乘法 7*8=56,1*1= 1次乘法 30*56=1680,2*2=4次乘法 连乘的复杂度分析(2) 若“n位数*m位数=n+m位数”,则n个单精度数,无论以何种顺序相乘,乘法次数一定为n(n-1)/2次 证明: 设F(n)表示乘法次数,则F(1)=0,满足题设 设kn时,F(k)=k(k-1)/2,现在计算F(n) 设最后一次乘法计算为“k位数*(n-k)位数”,则 F(n)=F(k)+F(n-k)+k (n-k)=n(n-1)/2(与k的选择无关) 设置缓存(1) 一个例子:计算9*8*3*2 方法一:顺序连乘 9*8=72,1*1=1次乘法 72*3=216,2*1=2次乘法 216*2=432,3*1=3次乘法 方法二:非顺序连乘 9*8=72,1*1=1次乘法 3*2=6,1*1=1次乘法 72*6=432,2*1=2次乘法 设置缓存(2) 考虑k+t个单精度数相乘a1*a2*…*ak*ak+1*…*ak+t 设a1*a2*…*ak结果为m位高进制数(假设已经算出) ak+1*…*ak+t结果为1位高进制数 若顺序相乘,需要t次“m位数*1位数” ,共mt次乘法 可以先计算ak+1*…*ak+t,再一起乘,只需要m+t次乘法 设置缓存(3) 缓存的大小 设所选标准数据类型最大可以直接处理t位十进制数 设缓存为k位十进制数,每个小整数段保存t–k位十进制数 设最后结果为n位十进制数,则乘法次数约为 k/(n–k) ∑(i=1..n/k)i=(n+k)n/(2k(t–k)),其中k远小于n 要乘法次数最少,只需k (t–k)最大,这时k=t/2 因此,缓存的大小与每个小整数段大小一样时,效率最高 故在一般的连乘运算中,可以用Comp作为基本整数类型,每个小整数段为9位十进制数,缓存也是9位十进制数 分解质因数求阶乘 例:10!=28*34*52*7 n!分解质因数的复杂度远小于nlogn,可以忽略不计 与普通算法相比,分解质因数后,虽然因子个数m变多了,但结果的位数n没有变,只要使用了缓存,乘法次数还是约为n(n-1)/2次 因此,分解质因数不会变慢(这也可以通过实践来说明) 分解质因数之后,出现了大量求乘幂的运算,我们可以优化求乘幂的算法。这样,分解质因数的好处就体现出来了 二分法求乘幂 二分法求乘幂,即: a2

文档评论(0)

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

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

1亿VIP精品文档

相关文档