1. 程式人生 > >階乘數的快速計算方法

階乘數的快速計算方法

  如何快速計算階乘數n!?一種簡單的辦法是採用下面的迴圈: fac=1; for (k=2;k<=n;k++)   fac*= k; 最後的fac值即為n!的值。當然,當n較大,n!超過計算機字長表示範圍時,可以採用多精度算術進行計算。 事實上有一種更高效的問題求解方法,其思路是:首先將n!分解為唯一的素因子的乘積形式,然後,對該乘積進行適當優化,例如,10!=2^8*3^4*5^2*7時的一種計算方法為:

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;
l計算518400*7=3628800

 總計使用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;

}