版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Miranda_ymz/article/details/83245948
分类:斯特林公式
题意:给你n问n!中有多少位数。
知识一:n的位数为(int)log10(n) +1.
知识二:斯特林公式:n!=sqrt(2*pi*n)(n/e)^n。
此题可以暴力也可以利用公式求解。公式求解为log10(n!)==n*(log10(n)-log10(e))+0.5*log10(2*n*pi)
(此外我使用公式时候错了好几次,原因是精度问题,pi和e的数位不够)
1)暴力
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
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;
}
2)斯特林公式
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
const double pi=3.1415926535897932385;
const double e=2.7182818284590452354;
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
double ans;
ans=n*(log10(n)-log10(e))+0.5*log10(2*n*pi);
printf("%d\n",(int)ans+1);
}
return 0;
}