題目連接:http://poj.org/problem?id=1423
題目大意是給一個輸入m,計算F(m!)(m的階乘)的位數,即F(3!)==1,F(4!)==2
對於此類題目的第一反應:這個是一個數學問題。
既然是數學問題,那麼在思考或者搜索資料時的關鍵字不是題目的標題,而是階乘的計算公式。當然,網上會給出最一般的連乘表達式,這不是我們需要的,應該問題是位數,不是真正的階乘結果。等你把m!的真值算出來,估計時間上就超了。
繼續搜索之下,知道了一個名叫斯特林公式,它也是用來計算階乘的結果,但是與連乘公式不同的是它短小精幹,而且非常適合此問題的求解。爲什麼?一個doule num的位數等於floor(log10(num))+1(取10爲底的對數並向下取整,然後加1)
不難看出,對數運算將斯特靈公式進行了極大的簡化,最終求出m!的位數。
代碼如下:
<span style="font-size:18px;">#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
double Pi=acos(-1.0);
double E=exp(1.0);
int solve(int m){
if(m==1) return 1;
return floor(0.5*log10(2*Pi*m)+m*log10(m/E))+1;
}
int main()
{
int n, m;
scanf("%d", &n);
while(n--){
scanf("%d",&m);
printf("%d\n", solve(m));
}
return 0;
}</span>