斯特林公式
n!≈2πn−−−√(ne)n
求n!的位数
利用斯特林(Stirling)公式的进行求解。下面是推导得到的公式:
res=(long)( (log10(sqrt(2.0*πn)) + n(log10(n)-log10(exp(1.0)))) + 1 );
当n=1的时候,上面的公式不适用,所以要单独处理n=1的情况!
这种方法速度很快就可以得到结果。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define PI 2*acos(0)
int main ()
{
int t, cnt = 1;
scanf("%d", &t);
while(t--)
{
int n, k;
scanf("%d %d", &n, &k);
printf("Case %d: ", cnt++);
if(!n || n == 1)
{
puts("1");
continue;
}
int ans = ((log10(sqrt(2*PI*n))/log10(k)) + n*((log10(n)/log10(k))-(log10(exp(1.0))/log10(k))) + 1);//斯特林公式
printf("%d\n", ans);
}
return 0;
}