做这题之前,在网上查了些资料,开始知道n!的位数可以这样求得:num=log10(2)+log10(3)+log10(4)+........log10(n)+1;
但题目的数太大了,运用该方法显然会超时!!!!
于是接下来就了解到了“斯特林公式”,该公式是用来求于n!的近似值的。
斯特林公式:
http://hi.baidu.com/vincentz/blog/item/54686c63fa113f630c33fafe.html
有了以上公式,只需要知道如何求一个数的位数即可,公式:num=log10(N)+1;
代码如下:
#include<stdio.h>
#include<math.h>
const double e = 2.7182818284590452354, pi = 3.141592653589793239;
void main()
{
int N;
scanf("%d",&N);
while(N--)
{
int n;
double ans=0;
scanf("%d",&n);
// 以下部分可要可不要
/*if(n<=100000)
{ int i;
for(i=2;i<=n;i++)
ans+=log10((double)i);
}
else*/
ans=log10(sqrt(2*pi*n))+n*log10(n/e);
printf("%d\n",(int)ans+1);
}
}
写出来,只是希望对大家有帮助哦!!!