階乘數的快速計算方法
阿新 • • 發佈:2018-12-31
如何快速計算階乘數n!?一種簡單的辦法是採用下面的迴圈:
fac=1;
for (k=2;k<=n;k++)
fac*= k;
最後的fac值即為n!的值。當然,當n較大,n!超過計算機字長表示範圍時,可以採用多精度算術進行計算。
事實上有一種更高效的問題求解方法,其思路是:首先將n!分解為唯一的素因子的乘積形式,然後,對該乘積進行適當優化,例如,10!=2^8*3^4*5^2*7時的一種計算方法為:
l計算518400*7=3628800
2^8*3^4*5^2*7=(2*3*5*7)*(2*3*5)*(2*3)^2*2^4
計算2*3,2*3*5及2*3*5*7等共需要3次乘法,而計算(2*3)^2需要一次乘法,計算2^4需要兩次乘法,將它們乘在一起還需要3次乘法,這樣總共進行了9次乘法。
也可以採用其他計算格式,例如:
l計算2^2=4,問題歸約為4^4*3^4*5^2*7; l計算4*3=12, 問題歸約為12^4*5^2*7; l計算12^2=144, 問題歸約為144^2*5^2*7; l計算144*5=720,問題歸約為720^2*7; l計算720^2=518400;總計使用6次乘法。一般地, 我們提出以下問題:假設n!=p1^k1*p2^k2*…*pm^km,如何有效地計算n!?顯然, 若p1<p2<…<pm, 則k1>=k2>=…>=km。其中ki可以採用一下方法得到:
r=n;
k[i]=0;
while(r>0)
{
r=r/p[i];
k[i]+=r;
}