斯特灵公式

关于斯特灵公式:

用处:用来取n的阶乘近似值的数学公式。一般来说,当n很大的时候,n阶乘的计算量十分大,所以斯特林公式十分好用,而且,即使在n很小的时候,斯特林公式的取值已经十分准确。

形式:

n! \approx \sqrt{2\pi n}\, \left(\frac{n}{e}\right)^{n}
或更精确的
\lim_{n \rightarrow +\infty} {\frac{n!}{\sqrt{2\pi n}\, \left(\frac{n}{e}\right)^{n}}} = 1
\lim_{n \rightarrow \infty} {\frac{e^n\, n!}{n^n \sqrt{n}}} = \sqrt{2 \pi}
证明:

a_n=\frac{n!}{n^{n+\frac{1}{2}}e^{-n}}
\frac{a_{n}}{a_{n+1}} = \frac{(n+1)^{n+\frac32}}{  n^{n+\frac12}  (n+1) e }
=  \frac{(n+1)^{n+\frac12}}{ n^{n+\frac12} e }
= \left(1+\frac{1}{n}\right)^n \left(1+\frac{1}{n}\right)^{\frac12} \frac{1}{e}
所以
\frac{a_{n}}{a_{n+1}}>1
a_n > a_{n+1}
,又由积分放缩法有
\ln n! < \left( n+\frac12 \right) \ln n-n+1
n! < e n^{n+\frac12} e^{-n}
,即
a_n < e
单调有界定理
a_n
的极限存在,
A = \lim_{n \to +\infty} a_n
A = \lim_{n \to +\infty} \frac{n!}{ n^{n+\frac12} e^{-n} }
利用 Wallis公式
\frac{\pi}{2} = \lim_{n \to +\infty} \frac{ \left[ \frac{(2n)!!}{ (2n-1)!!} \right]^2}{2n+1}
\begin{array}{rcl}\dfrac{\pi}{2} & = & \displaystyle \lim_{x \to +\infty} \frac{\left[ \frac{(2n)!!}{(2n-1)!!} \right]^2}{2n+1} \\& = & \displaystyle \lim_{x \to +\infty}  \frac{ \left[ \frac{(2n)!! (2n)!!}{(2n)!} \right]^2 }{2n+1} \\& = & \displaystyle \lim_{x \to +\infty}  \frac{2^{4n} \left[ \frac{(n!)^2}{(2n)!} \right]^2}{2n+1} \\& = & \displaystyle \lim_{x \to +\infty}  \frac{2^{4n} \left[ \frac{(A  n^{n+\frac12}  e^{-n} )^2}{A (2n)^{2n+\frac12}  e^{-2n}} \right]^2}{2n+1} \\& = & \displaystyle \lim_{x \to +\infty} \frac{2^{4n} \left( 2^{-2n-\frac12} A \sqrt n \right)^2}{2n+1} \\& = & \displaystyle \lim_{x \to +\infty} \frac{2^{4n} A^2 2^{-4n-1} * n}{2n+1} \\& = & \dfrac{A^2}{4}\end{array}
所以
A = \sqrt{2 \pi}
\lim_{n \to +\infty} \frac{n!}{n^{n+\frac12} e^{-n}} = \sqrt{2 \pi}
\lim_{n\to+\infty}\frac{\sqrt{2\pi n}\;n^ne^{-n}}{n!}=1

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值