POJ 1423 BIG NUMBER

題目連接: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>


發佈了45 篇原創文章 · 獲贊 15 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章