描述
n!階乘是乙個非常大的數,大家都知道計算公式是n!=n*(n-1)······*2*1.現在你的任務是計算出n!的位數有多少(十進位制)?
輸入首行輸入n,表示有多少組測試資料(n<10)
隨後n行每行輸入一組測試資料 n( 0 < n < 1000000 )
輸出對於每個數n,輸出n!的(十進位制)位數。
樣例輸入
313樣例輸出32000
11130271
/*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(doublen)
returnx;}
intmain()
return0;
}
大數處理 階乘數字
計算出第乙個正整數n的階乘位數大於等於 10000的數是多少,即求最小的正整數 n滿足n 的位數大於等於 10000 知識點 某數 m 的位數可以由log10 n 1取得 include include include include include using namespace std cons...
洛谷 階乘數碼 階乘之和
題目描述求n 中某個數碼出現的次數。輸入格式 第一行為t 10 表示資料組數。接下來t行,每行乙個正整數n 1000 和數碼a。輸出格式 對於每組資料,輸出乙個整數,表示n 中a出現的次數。輸入樣例 1 2 5 27 0 輸出樣例 1 1 2 直接高精階乘 include include inclu...
JZOJ 5791 階乘 數論
description 有n個正整數a i 設它們乘積為p,你可以給p乘上乙個正整數q,使p q剛好為正整數m的階乘,求m的最小值。input 共兩行。第一行乙個正整數n。第二行n個正整數a i output 共一行乙個正整數m。題目要求乙個最小的m mm使m!m!m!包含p pp這個因子。可以把p...