PHP

阶乘的长度

2010/11/13

利用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;
}

原文地址http://psyuhen.blog.163.com/blog/static/12090622200831414433716/