NYOJ 69 數的長度

2021-06-19 17:44:40 字數 1378 閱讀 5020

時間限制:

3000

ms  |  記憶體限制:

65535

kb難度:

1 描述

n!階乘是乙個非常大的數,大家都知道計算公式是n!=n*(n-1)······*2*1.現在你的任務是計算出n!的位數有多少(十進位制)?

輸入

首行輸入n,表示有多少組測試資料(n<10)

隨後n行每行輸入一組測試資料 n( 0 < n < 1000000 )

輸出對於每個數n,輸出n!的(十進位制)位數。

樣例輸入

313

32000

樣例輸出

1

1130271

思路:參考斯特林公式

(long)((log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 )

#include #include int main()

else

printf("%d\n",cnt);

} return 0;

}

/* nyoj69 階乘數字長度

* 方法一:

* 可設想n!的結果是不大於10的m次冪的數,即n!<=10^m(10的m次方),則不小於m的最小整數就是 n!的位數,對

* 該式兩邊取對數,有 m =log10^n! 即:m = log10^1+log10^2+log10^3...+log10^n 迴圈求和,就能算得m值,

* 該m是n!的精確位數。當n比較大的時候,這種方法方法需要花費很多的時間。

* * 方法二:

* 利用斯特林(stirling)公式的進行求解。下面是推導得到的公式:

* res=(long)( (log10(sqrt(4.0*acos(0.0)*n)) + n*(log10(n)-log10(exp(1.0)))) + 1 );

* 當n=1的時候,上面的公式不適用,所以要單獨處理n=1的情況!

* 有關斯特林(stirling)公式及其相關推導,這裡就不進行詳細描述,有興趣的話可看這裡。

* 這種方法速度很快就可以得到結果。詳細證明如下:

* */#include#include using namespace std;

int normal(double n)

return (int)x+1;

}long stirling(double n)

return x;

}int main()

{ int n;

cin>>n;

while(n--)

{ int x;

cin>>x;

cout<

nyoj 69 數的長度

時間限制 3000 ms 記憶體限制 65535 kb 難度 1描述 n!階乘是乙個非常大的數,大家都知道計算公式是n n n 1 2 1.現在你的任務是計算出n!的位數有多少 十進位制 輸入 首行輸入n,表示有多少組測試資料 n 10 隨後n行每行輸入一組測試資料 n 0 n 1000000 輸出...

69 數的長度

時間限制 3000 ms 記憶體限制 65535 kb 難度 1 描述 n!階乘是乙個非常大的數,大家都知道計算公式是n n n 1 2 1.現在你的任務是計算出n!的位數有多少 十進位制 輸入 首行輸入n,表示有多少組測試資料 n 10 隨後n行每行輸入一組測試資料 n 0 n 1000000 輸...

南陽 69 數的長度

stirling公式 斯特林公式 n!1 2 3 4 5 n 如果要計算n!後得到的位數,則我們可以知道其等於lgn!1 lgn!lg1 lg2 lg3 lg4 lg5 lgn 但是當n很大的時候,我們可以通過數學公式進行優化 即stirling公式 n!sqrt 2 pi n n e n pi 3...