PHP
阶乘的长度
利用Stirling公式(公式的推导可以从百度百科上面找到,我是没看懂。。):
n!~=pow((n/e),n)*sqrt(2*PI*n) ,n-->无穷
因为在求pow((n/e),n)可能遇到数据溢出的现象。
所以可以把公式转换一下。
log(n!) ~= n*log(n/e) + 0.5*log(2*PI*n);
但是这个公式在计算32000的阶乘的时候却和结果相差很大。
但是我们可以运用 M=log10(1)+log10(2)+...+log10(n)
上面那个公式,
以下代码
#include<iostream>
#include <cmath>
using namespace std;
int main()
{
int caseNum,i,j,n,count;
double sum;
while (cin>>caseNum)
{
for (i=0;i<caseNum;++i)
{
cin>>n;
sum = 0.0f;
count = 0;
for (j=1;j<=n;++j)
{
sum +=log10f(static_cast<float>(j));//M=log10(1)+log10(2)+...+log10(n)
}
cout<<static_cast<int>(sum)+1<<endl;
}
}
return 0;
}