用Stirling逼近近似計算階乘n!
1、求n!的前幾位
先看公式:
θ十分接近1,而且在逐漸地逼近1,實際上,即使是求1的階乘,θ也會達到0.9727376027,這是一個本身就是一個很“精確”的數字了!當n=1000時,θ將0.99999996665875876427498746773752,與1的差別只有0.000000033341241235725012532263(約等於3.33412×10-8)!
這樣可以推出求階乘前幾位的最後公式爲:
2、求位數
lg(n)+1=n的位數 (注意:lg是指以10爲底的對數)
繼而推出
--------------------------------------------------------------------------------------------------下面附上用C++寫的代碼:
#include<iostream>
#include<cmath>
using namespace std;
int fac(int n){//遞歸求階乘(很有限)
if(n>1){
return n*fac(n-1);
}else{
return n;
}
}
double frac(double n){
return n-floor(n);
}
int stirlingp(int n){//計算階乘結果的位數
return floor(0.5*log10(2*n*3.1415926)+n*log10(n/exp(1.0)))+1;
}
double stirling(int n,int p){//計算階乘n!結果的前面(從左到右)p位
return pow(10.0,frac(0.5*log10(2*n*3.1415926)+n*log10(n/exp(1.0))))*exp(1.0/12/n)*pow(10.0,p-1);
}
void main()
{
cout<<stirling(4,1)<<"E+"<<stirlingp(4)<<endl;
getchar();
}
--------------------------------------------------------------------------------------------------
文本公式推導源於《用Stirling逼近近似計算階乘的探討與應用》仲晨 2005年寫的一篇文章那時還是高中生,實在厲害,文本只做結果使用!