C++ 大数相乘的高效方案

最近在刷hackerRank中的一道题,其中用到了大数相乘,搞了好久,始终在最后一个test case里面time out了,java或python自带大数运算,但是数长超过64位的数运算c++要自己写,下面是总结研究过的几种方案。

 

1按照手算的方法

对两个数的每一位进行相乘,逢10进位,最后进行相加,每一个位的数字可以用String或 char []来存储,时间复杂度n * m

 

2按照复数的计算方法

此方法来源于Stanford一个教授S.Dasgupta写的一本书《Algorithms》,此方法是这样的:

复数相乘:  


所以就可以得到:X1 乘以X2 由ac, bd, 以及(a+b)(c+d)的组合,ac, bd, (a+b)(c+d)等数字长度相比于X1,X2都减少了,在计算机的世界里这相当于减少了迭代的次数,时间复杂度也就相应减少了。

具体是怎么操作呢?

复数里面 j 的平方为-1, 那实数呢?举个例子就明白了。

这里j=100, a=77, b=99, c=34, d=12, 在计算机里乘以100这种操作是相对简单的,仅仅是在末尾添加两个0,后面的ac, bd这些乘法运算通过递归执行相同的算法,这样迭代的次数相比原来应该会减少很多。

3第三个方案是改变基数

在我们现实的世界里,我们都按10进制来进行的,但是对于计算机来说,string 或char [] 每一个byte是8bits的,只用来表示0到9是不是有点浪费,8bits 可以用来表示0到255, 比如9977这个数,按照传统的存储方法是以10为基数,存储是这样的:

[9,9,7,7], 

但是如果我们一个byte表示的数是以100为基数,逢100进1, 那么我们可以这样存储:

[99,77]

既然可以用100作为基数,那么1000,10000等等都是可以的,当然这时string, char[]等这时就不适用了,用int, long long intl来存数,。

数据长度相对减少了,相应的迭代的次数或时间复杂度也会减少。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章