题解的方法确实让我大开眼界。
求n!的位数。
方法1:
求10^m>=n!,的最小m值。
=log10(n!)=log10(n)+log10(n-1)+log10(n-2)+…+log10(1)。
为了保存精度,答案用double存,最后数据类型转换并+1。double转int向下取整。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
double ans=0;
for(int i=1;i<=n;i++)
ans+=log10(i);
printf("%d\n",(int)ans+1);
}
return 0;
}
方法二:
斯特林公式:
n!的位数=1/2log10(2pin)+n(log10(n)-log10(e));
#include <bits/stdc++.h>
using namespace std;
const double pi=3.1415926;//注意精度,否则wa
const double e=2.71828182;
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
double ans=0.5*log10(2*pi*n)+n*(log10(n)-log10(e));
printf("%d\n",(int)ans+1);
}
return 0;
}