- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
大整数乘法程序分析
161120114 汪圆圆
161120116 刘 程
161120115 张 健
161120113 王星宇
数据结构
用string类型存储大整数和大整数的乘积,string是C++自带的一个类,为字符串类型,因为字符串类型方便对大整数进行分段,前加0和后加0操作。在进行运算时,把字符串换成数字进行运算。
运算结果截图:
大整数为2位时:
大整数为5位时:
大整数为10位时:
大整数为100位时:
大整数为200位时:
大整数为300位时:
大整数为600位时:
大整数为1000位时:
算法复杂性
通常,在分析算法的计算复杂性时,都将加法和乘法运算当作基本运算来处理,即将执行一次加法或乘法运算所需的计算时间,当作一个仅取决于计算机硬件处理速度的常数。这个假定仅在参加运算的整数能在计算机硬件对整数的表示范围内直接处理才是合理的。然而,在某些情况下,要处理很大的整数,它无法在计算机硬件能直接表示的整数范围内进行处理。若用浮点数来表示它,则只能近似的表示它的大小,计算结果中的有效数字也受到限制。若要精确地表示大整数并在计算结果中要求精确地得到所有位数上的数字,就必须用软件的方法来实现大整数的算术运算。 设X和Y都是n位的二进制整数,现在要计算它们的乘积Z。可以用小学所学的方法来设计计算乘积XY的算法,但是这样做计算步骤太多,效率较低。如果将每2个1位数的乘法或加法看作一步运算,那么这种方法要进行O(n^2)步运算才能算出乘积XY。下面用分治法来设计更有效额大整数乘积算法。
将n位二进制数X和Y都分为两段,每段长n/2位(为简单起见,假设n是2的幂)。则有:
其中X1、Xo分别为X的高位和低位,Y1、Yo分别为Y的高位和低位。C2是它们的前半部分的积;Co是它们后半部分的积;C1是X、Y两部分的和的积减去C2与C0的积。如果n/2也是偶数,我们可以利用相同的方法来计算C2、Co的和C1。因此我们就得到了一个计算n位数积的递归算法:
在这种完美的形式下,当n变成1时,递归就停止了.或者当我们认为n已经够小了,小到可以直接对这样大小的数相乘时,递归就可以停止了. 该算法会有多少次位乘呢?因为n位数的乘法需要对n/2位数做三次乘法运算,乘法次数M(n)的递推式将会是: 当n1时,M(n)=3M(n/2),M(1)=1 当n=2^k时,我们可以用反向替换法对它求解:
因为
文档评论(0)