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來存數,。

數據長度相對減少了,相應的迭代的次數或時間複雜度也會減少。

 

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