ACM算法_斯特林公式求N的阶乘的位数
斯特林公式(Stirling’s approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确
π=3.1415926=acos(-1.0);
e=2.718
举例:计算n的阶乘有多少位?(十进制)
n在20以上的时候,阶乘结果就已经爆了,所以不可能算出来再判断
10x 10 x 到 10x+1 10 x + 1 之间恰好包括所有x+1位的数
所以判断一个数n的位数,只需计算出 lgn lg n 的整数部分即可
lg(n!) l g ( n ! ) = lg(2πn)2 l g ( 2 π n ) 2 + n∗(lg(n)−lg(e)) n ∗ ( l g ( n ) − l g ( e ) )
AC代码
#include<iostream>
#include<cmath>
using namespace std;
const double e = 2.71828182845;
const double pi = 3.1415926;
int main(void)
{
int t, i, f, v;
double a, s;
const double log10_e = log10(e);
const double log10_2_pi = log10(2.0*pi) / 2.0;
while (cin>>t && t)
{
for (i = 0; i < t; ++i)
{
cin >> v;
if (1 == v) {
cout << "1\n";
continue;
}
a = v;
s = log10_2_pi + (a + 0.5)*log10(a) - a * log10_e;
f = ceil(s);
cout << f << endl;
}
}
return 0;
}