**萬進製思想:
日常生活中我們習慣用十進位制去運算;
為了方便電腦識別開發出了二進位制,又因為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 時會有大量重複計...