大数系列三——斐波那契数列——高效万进制,亿进制
淺談萬進制思想:
日常生活中我們習慣用十進制去運算;
為了方便電腦識別開發出了二進制,又因為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<stdio.h> int main() {int a1[10000], a2[10000], a3[10000];//a1為第n個數,a2為第n-1個數,a3做中間變量轉換a1和a2int n; scanf("%d", &n);int places = 0, carry, i, j; //places是總位數,carry是進位for(i = 0; i < n; i++) {carry = 0;if(i == 0 || i == 1) a1[0] = a2[0] = 1;else {for(j = 0; j <= places; j++) {a3[j] = a1[j]; //做變量轉化,a3做中間變量a1[j] += a2[j]; a1[j] += carry; //不僅要加前一個數,還要加上次運算后的進位。carry = a1[j]/10000; //求進位a1[j] %=10000; a2[j] = a3[j]; //變量轉換,a3做中間變量}if(carry > 0) { //如果進位>0,則總位數+1。places++; a1[places] = carry; }}}printf("%d",a1[places]);for(i = (places-1); i >= 0; i--) printf("%04d", a1[i]); //域寬為4,不夠補0return 0; }按照與萬進制相同的原理類推億進制:
億進制核心思想:
用數組儲存數值,將每個數組元素當成“大數”一位數,如果元素值大于99999999,則要進位,進位的值為元素值%100000000;這也可以理解為一個“億進制”,可以存儲的值,就相當于十進制的每一位從0~10變成了0~99999999,就等同于從十進制變成了億進制。
只需將萬進制代碼中13,14行中的10000改為10000000,第29行的%04d改為%08d,就變成了億進制:
億進制代碼:
#include<stdio.h> int main() {int a1[3000], a2[3000], a3[3000];int places = 0, carry, i, j;int n; scanf("%d", &n);for(i = 0; i < n; i++) { //核心循環 carry = 0;if(i == 0 || i == 1) a1[0] = a2[0] = 1;else {for(j = 0; j <= places; j++) {a3[j] = a1[j]; //做變量轉化 a1[j] += a2[j]; a1[j] += carry; //三行核心代碼 carry = a1[j]/100000000;a1[j] %=100000000;a2[j] = a3[j]; //變量轉換 }if(carry > 0) { places++; a1[places] = carry; }}} printf("%d",a1[places]);for(i = (places-1); i >= 0; i--) printf("%08d", a1[i]);return 0; }效率:
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.幾秒,通過概率會提高很多。
日拱一卒,功不唐捐。
總結
以上是生活随笔為你收集整理的大数系列三——斐波那契数列——高效万进制,亿进制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 25行代码AC——习题5-7 打印队列(
- 下一篇: 19行代码AC——例题 6-2 铁轨(R