首先,定義兩個整型的數組:
int fac[1000];//暫且先設定是1000位,我稱之為“結果數組”
int add[1000];//我稱之為“進位元組”
現在具體說明兩個數組的作用:
1.fac[1000]
比如說,一個數5的階乘是120,那麼我就用這個數組儲存它:
fac[0]=0
fac[1]=2
fac[2]=1
現在明白了數組fac的作用了吧。用這樣的數組我們可以放階乘後結果是1000位的數。
2.在介紹add[1000]之前,我介紹一下演算法的思想,就以6!為例:
從上面我們知道了5!是怎樣儲存的。
就在5!的基礎上來計算6!,示範如下:
fac[0]=fac[0]*6=0
fac[1]=fac[1]*6=12
fac[2]=fac[2]*6=6
3.現在就用到了我們的:“進位元組”add[1000].
先得說明一下:add就是在第2步中用算出的結果中,第i位向第i+1位的進位元值。還是接上例:
add[0]=0;
add[1]=1; // 計算過程:就是 (fac[1]+add[0]) % 10=1
add[2]=0; // 計算過程:就是 (fac[2]+add[1]) % 10=0
.......
.......
.......
add[i+1] =( fac[i+1] + add ) % 10
現在就知道了我們的數組add[]是幹什麼的了吧,並且明白了add是如何求得的了吧。
4.知道了add[1000]的值,現在就在 1. 和 3 . 兩步的基礎上來計算最終的結果。(第2步僅作為我們理解的步驟,我們下面的計算已經包含了它)
fac[0] = ( fac[0]*6 ) mod 10 =0
fac[1] = ( fac[1]*6 + add[0] ) mod 10 =2
fac[2] = ( fac[2]*6 + add[1] ) mod 10=7
到這裡我們已經計算完了6!。然後就可以將數組fac[1000]中的數,以字元的形式按位輸出到螢幕上了。
5.還有一點需要說明,就是我們需要一個變數來記錄fac[1000]中實際用到了幾位,比如5!用了前3位;
我們在這裡定義為 top
為了計算top,我們有用到了add[1000],還是以上面的為例:
5!時,top=3,在此基礎上我們來看6!時top=?
由於 add[2]=0
所以 top=3(沒有變)
也就是說,如果最高位有進位時,我們的top=top+1,否則,top值不變。
6.總結一下,可以發現,我們把階乘轉化為 兩個10以內的數的乘法,還有兩個10以內的數的家法了。
因此,不管再大的數,基本上都能算出了,只要你的數組夠大就行了。
from:http://www.chinaunix.net/jh/23/312721.html