ACM算法_斯特林公式求N的阶乘的位数

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值