wiki:
斯特灵公式是一条用来取n阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特灵公式十分好用,而且,即使在n很小的时候,斯特灵公式的取值已经十分准确。
公式为:
这就是说,对于足够大的整数n,这两个数互为近似值。更加精确地:
或
题目求10^7的阶乘位数,数据量很大,自然想到利用log10
于是有 log10(N!) = log10(1) + log10(2) + ... + log10(N);
但这样求效率太差,于是直接将log10应用到斯特灵公式:
log10(n!) = log10(√(2*pi*n) * (n/e)^n) = 0.5 * log10(2*pi*n) + n*log10(n/e)
其中 pi = (double)acos((double)-1)
e = (double)exp((double)1)
code:
#include<stdio.h>
#include<math.h>
double pi = (double)acos((double)(-1));
double e = (double)exp((double)1);
double Sirtling(int n)
{
double a = 0.5*log10(2*pi*n) + n*(log10(n/e));
return a;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",(int)Sirtling(n) + 1);
}
return 0;
}