斯特林公式
n! = 1 * 2 * 3 * 4 * 5*…*n;
由于 n 很大,要计算 n! 后得到的数字为几位数, 可以取他的自然对数
lg(n!) = lg1+lg2+lg3+lg4+lg5+…+lgn
其位数就是 lg(n!)+1
用斯特林公式优化一下就是
lg(n!) + 1
= lg(sqrt(2πn)*(n/e) ^ n) + 1
=0.5lg(2πn) + n lg(n/e) + 1
两种方式的代码如下
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int N = 1e5+6;
const double inf = 0x3f3f3f3f;
const double eps = 1e-6;
int main()
{
int t, n, i;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
double ans = 0;
for(i = 1; i <= n; ++i)
ans += log10(i);
printf("%d\n", (int)ans+1);
}
return 0;
}
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int N = 1e5+6;
const double inf = 0x3f3f3f3f;
const double eps = 1e-6;
const double e = exp(1);
const double pi = acos(-1.0);
int main()
{
int t, n, i;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
printf("%d\n", (int)(0.5*log10(2.0*pi*n)+(double)n*log10((double)n/e))+1);
}
return 0;
}