HDU 1018 階乘位數 數學

2022-05-09 18:57:50 字數 1297 閱讀 3013

題意是求 n 的階乘的位數。

直接求 n 的階乘再求其位數是不行的,開始時思路很扯淡,想直接用乙個陣列存每個數階乘的位數,用變數 tmp 去存 n 與 n - 1 的階乘的最高位的數的乘積,那麼 n 的階乘的位數就等於 n - 1 的階乘的位數加 tmp 的位數再減去 1。

但這種做法是不對的,例如有可能最高位與 n 的乘積結果是 99,而其實 n 與其他位的乘積結果是能進到這一位的,也就是說實際應該在 n - 1 的階乘位數上增加 2 ( 3 -1 ) 位。而在對樣例測試時也發現 n 為 10 的時候結果尚正確,但當 n 為 20 的時候就比正確結果少了 1,也就是說發生了上述情況。

抱著僥倖心理,又再次將每次乘以最高位的做法調整成了每次乘以最高的兩位,這一次當 n 為 20 時結果依然正確,但是記憶體超了......

錯誤**:

1 #include 2

using

namespace

std;

3int tmp,dig[10000009];4

int getdigit(intn)5

12return

a;13}14

void

make()

1529}30

intmain()

3140

return0;

41 }

view code

首先,乙個數 x 的位數可以用以 10 為底取對數再向上取整的方法求得,即 digit( x ) = ceil ( log10( x ) );

那麼,階乘的位數可以直接求:digit( n! ) = ∑ log10( i ) ( i 從 1 取到 n ) 

**如下:

1 #include 2

using

namespace

std;

3int

main()

416 printf("

%d\n

",(int)ans+1

);17}18

return0;

19 }

view code

另外,在求 n 的階乘的時候用 stirling 公式 也是很好的做法,

**如下:

1 #include 2

using

namespace

std;

3const

double pi = acos(-1);4

intmain()514

return0;

15 }

view code

hdu 1018 計算乙個數階乘的位數

input input consists of several lines of integer numbers.the first line contains an integer n,which is the number of cases to be tested,followed by n ...

HDU1018求大數N!的位數 取對數

problem description input input consists of several lines of integer numbers.the first line contains an integer n,which is the number of cases to be t...

HDOJ 1018(階乘位數)

1.log10 num 1 2.較小數情況下,sprintf str,d num 輸出strlen str 所以不能初始化為0 自然對數 log 以二為底log2 num log num log2,因為那個自然對數的底是無理數,不好表示,只要有了自然對數的表示,其他用換底公式就ok啦 我一直想的是求...