前一段時間看到一個往年程序競賽的題解, 有一個題目說的是求 100 的階乘末尾有多少個 0. 題解中給出的講解提到, 一個數 n
的階乘末尾有多少個 0 取決于從 1 到 n 的各個數的因子中 2 和 5 的個數, 而 2 的個數是遠遠多余 5 的個數的, 因此求出 5
的個數即可. 題解中給出的求解因子 5 的個數的方法是用 n 不斷除以 5, 直到結果為 0, 然后把中間得到的結果累加. 例如, 100/5
= 20, 20/5 = 4, 4/5 = 0, 則 1 到 100 中因子 5 的個數為 (20 + 4 + 0) = 24 個, 即
100 的階乘末尾有 24 個 0. 其實不斷除以 5, 是因為每間隔 5 個數有一個數可以被 5 整除, 然后在這些可被 5 整除的數中,
每間隔 5 個數又有一個可以被 25 整除, 故要再除一次, ... 直到結果為 0, 表示沒有能繼續被 5 整除的數了.
今天無 意間看到有人問 1000 的階乘有幾位數, 上來就用上面的方法算了一下, 249, 又讀一遍題目, 才發現是求所有的位數, 想了好久也沒有思路, 無奈用 Python 算了一把, 結果有 2568 位, 可是依然不知道如何計算 1000 階乘的位數, 還好通過結果驗證了末尾有 249 個 0 是正確的...
今天無 意間看到有人問 1000 的階乘有幾位數, 上來就用上面的方法算了一下, 249, 又讀一遍題目, 才發現是求所有的位數, 想了好久也沒有思路, 無奈用 Python 算了一把, 結果有 2568 位, 可是依然不知道如何計算 1000 階乘的位數, 還好通過結果驗證了末尾有 249 個 0 是正確的...
假設log_10(x)表示x以10為底的對數,那么有:
log_10(N!) = log_10(1) + log_10(2) + ... + log_10(N)
我們先求出p = log_10(1) + log_10(2) + ... + log_10(N)
那么N! = pow(10, p)
如果對P進一法取整,則有p' = ceil(p)
那么N!的長度就是p'。
這是我自己想出來的,是否正確并不知道。如有你有興趣繼續探討這個問題,或是找到了更好的方法,歡迎你給我寫信:wolflock@sohu.com。
呵呵,你的算法事對的:)
20! = 2^18 * 3^8 * 5^4 * 7^2 * 11 * 13 * 17 * 19
因為
18 = 20/2 + 20/4 + 20/8 + 20/16
其他以此類推,這樣20!后面就有4個零。我們也就可以知道20! 可以整除2^18了
這問題可以用比較簡單的算法解決,歡迎探討。
In all seriousness, this is quite hilarious and, unfortunately, probably true.