大數系列三 斐波那契數列 高效萬進製,億進製

2021-10-03 19:03:56 字數 1974 閱讀 5165

**萬進製思想:

日常生活中我們習慣用十進位制去運算;

為了方便電腦識別開發出了二進位制,又因為2^3=8 , 2^4=16,因此應運而生了八進位制與16進製制。

世上本沒有路,走的人多了,也便成了路,那麼既然二進位制可以衍生出8,16進製制,為什麼十進位制不可以衍生更大的進製呢?

因此聰明的人們開發出了萬進製,也就是10^4=10000 模仿二進位制與十六進製制的運算。漸漸的,我們發現萬進製在進行大數運算方面有著無可比擬的優勢。

核心思想:

用陣列儲存數值,將每個陣列元素當成「大數」的一位數,如果元素值大於9999,則要進製,進製的值為元素值%10000;這也可以理解為乙個「萬進製」,可以儲存的值,就相當於十進位制的每一位從0~10變成了0~9999,就等同於從十進位制變成了萬進製。

如:662343889 * 5 = 3311719445

那麼如果用萬進製計算:可以設乙個陣列a[3]; a[2] = 3889 ; a[1] = 6234 ; a[0] = 6 ;

第一步:a[2] * 5 = 19445 ; 19445 %10000 = 1餘9445 9445留下,1進製;

第二步:a[1] * 5 = 31170 ; 31170 %10000 = 3餘1170 1170留下,加上進製的1為1171(終值),3進製;

第三步:a[0] * 5 = 30 ; 30+3(進製)為終值。

按順序輸出得:3311719945 ;僅僅三步我們便得出了最後結果,如果用十進位制呢?每位相加,對於本例,至少要十步。效率快了3倍不止。

下面上**:

輸入:n (第n為斐波那契數。)

輸出:輸出該數。

萬進製**:

#include

intmain()

if(carry >0)

}}printf

("%d"

,a1[places]);

for(i =

(places-1)

; i >=

0; i--

)printf

("%04d"

, a1[i]);

//域寬為4,不夠補0

return0;

}

按照與萬進製相同的原理類推億進製:

億進製核心思想:

用陣列儲存數值,將每個陣列元素當成「大數」一位數,如果元素值大於99999999,則要進製,進製的值為元素值%100000000;這也可以理解為乙個「億進製」,可以儲存的值,就相當於十進位制的每一位從0~10變成了0~99999999,就等同於從十進位制變成了億進製。

只需將萬進製**中13,14行中的10000改為10000000,第29行的%04d改為%08d,就變成了億進製:

億進製**:

#include

intmain()

if(carry >0)

}}printf

("%d"

,a1[places]);

for(i =

(places-1)

; i >=

0; i--

)printf

("%08d"

, a1[i]);

return0;

}

效率:

n取=100000時,大概要輸出2.1w位。

十進位制:10w位的c語言程式執行時間在7s左右,未測試c++執行時間

萬進製:10w位c語言的執行時間在2.1s左右,c++執行時間2.7s左右

億進製:10w位的c語言執行時間1.2s左右,c++執行時間2.0s左右。

結論1:超大量計算時,c++要比c慢一些。

結論2:萬進製的高效顯而易見了,尤其是億進製, 須知程式執行的時限一般在1秒或3秒,尤其是對於**效率要求很高的題。多出0.幾秒,通過概率會提高很多。

日拱一卒,功不唐捐。

斐波那契數列 斐波那契數列python實現

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...

迴圈斐波那契數列 斐波那契數列應用

什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...

斐波那契數列(高效遞迴版)

斐波那契數列 1,1,2,3,5,8,13,21,34,55 定義 f 1 1,f 2 1,f n f n 1 f n 2 n 3 初學的做法通常如下 int fab int n 但這樣做很大的缺陷是在遞迴呼叫時會有大量的記憶體占用,在參加競賽時會因超時而報錯。因為當遞迴計算f i 時會有大量重複計...