如何快速计算阶乘数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;
}