斯特林公式(Stirling's approximation)
斯特林公式(Stirling's approximation)是一條用來取n的階乘的近似值的數學公式。一般來說,當n很大的時候,n階乘的計算量十分大,所以斯特林公式十分好用,而且,即使在n很小的時候,斯特林公式的取值已經十分準確。
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
公式為:? ?
?從圖中看出,對于足夠大的整數n,這兩個數互為近似值。更加精確地:? ?
?? ? ?? ? ? ?或者?? ? ? ?
?
?這個公式,以及誤差的估計,可以推導如下。我們不直接估計n!,而是考慮它的自然對數:
? ?
?
按一般方法計算N的階乘,其時間復雜度為O(N):?? ?N!= 1 * 2 * 3 * 4 * 5 * ............ * N;
?
如果要計算N后得到的數字為幾位數,則我們可以知道其位數等于lgN!+1;
則:?
但是當N很大的時候,我們可以通過斯特林公式進行優化:(即Stirling公式)
(e = 2.718)
斯特林公式可以用來估算某數的大小,結合lg可以估算某數的位數,或者可以估算某數的階乘是另一個數的倍數。
?
例題:??http://acm.hdu.edu.cn/showproblem.php?pid=1018
題目給出的N的范圍是: 1<= N <=?107 ?
用普通方法肯定算不出N的階乘后的出的數字位數,但運用斯特林公式則很好解決.
?
?
Stirling 公式
即:
? ? Stirling公式的意義在于:當n足夠大時,n!計算起來十分困難,雖然有很多關于n!的等式,但并不能很好地對階乘結果進行估計,尤其是n很大之后,誤差將會非常大。但利用Stirling公式可以將階乘轉化成冪函數,使得階乘的結果得以更好的估計。而且n越大,估計得越準確。
?
?
利用Stirling公式求解n!的位數:易知整數n的位數為[lgn]+1。利用Stirling公式計算n!結果的位數時,可以兩邊取對數,得:
故n!的位數為:
再添加一道例題:
#include <bits/stdc++.h> using namespace std; #define e exp(1) #define pi acos(-1) double log8(double x) {return log(x)/log(8);//loga(b)=logc(b)/logc(a) } double strling(double n) {return log8(2*pi*n)/2.0+n*(log8(n/e)); } int main() {int pp;scanf("%d",&pp);while (pp--) {int n;scanf("%d",&n);if (n==0) {puts("1");continue;}long long ans=(long long )strling(double(n));printf("%lld\n",ans+1);}return 0; }
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的斯特林公式(Stirling's approximation)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringCloud 入门教程(五):
- 下一篇: pat天梯赛练习 L2-006