关于斯特灵公式:
用处:用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。
形式:
或更精确的
或
令
则
所以
即
,又由积分放缩法有
即
,即
由
单调有界定理
的极限存在,
设
利用
Wallis公式,
所以
即
HDU1018&&POJ1423
题意:给定一个整数n,求它的阶乘的位数
思路:
(1)由于数据较大,我们不能暴力解决阶乘的问题 ,那么此时就可以联想到斯特灵公式,因为斯特灵公式可以近似的求出n的阶乘,那么只要根据斯特灵公式就可以了,关于求一个数的位数,那么就可以对n!取对数,再除上ln10就可以了
(2)直接在等式两边取对数,对数M=logN!=log1+log2+......logn
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
using namespace std;
const double PI=acos(-1.0);//求pi的值
double Log(int n)
{
return (n*log(n*1.0)-n+0.5*log(2*n*PI))/log(10);
}
int main()
{
int t;
int n;
cin>>t;
while(t--)
{
cin>>n;
double sum=Log(n);
cout<<(int)sum+1<<endl;
}
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
double log(int n)
{
double k=0.0;
for(int i=1;i<=n;i++)
{
k+=log10(i*1.0);
}
return k;
}
int main()
{
int t;
int n;
cin>>t;
while(t--)
{
cin>>n;
cout<<(int)log(n)+1<<endl;
}
return 0;
}