也是壇裡面的問題:
已知正整數 n 求 n!的十進位制數共有多少位。
這個 n! 怎麼辦?
n! 的增長率是很可怕的,比 e^n 還要快,其實就是 o(n^n),當 n 值「較」大時,就不能忍了。這個「較」有多大呢?等後面算完了就知道了。遞迴算 n!,便是尾遞迴來說,便是棧展得開,效率也受不了,便是效率受得了,也沒地兒放。所以絕對不能去算 n!
但只求位數的話,這比較好解,答案是 fix ( log10(n!) ) + 1,是吧,對數是增長級殺手……
反正我們是為了算 ln(n!),可以從數學上找方法。
由於 ln (ab) = ln(a) + ln(b),那麼 ln(n!) 是可以展成乙個 n 項加式的,但是……n 項式,每項都要求 ln,不是「很」好……
這裡引出 stirling 公式:
看樣子不錯,便是 n 值「很」小時,捨掉近似項的準確度也是令人滿意的,至少,不會影響到 ln(n!),這是一定的。讀者可以驗證,這個「很」到多小呢?這個可以在此說明,n 可以小到 1!
所以,通過 stirling 公式,只用算兩次 log10 就解決了。
o(1/n)的係數是 1/12,而且這已是一列阻尼級數的最大振幅了,所以便是當 n = 1 的時候,誤差最大不過 1/12,對於計算位數,根本不受影響。
用 matlab 就兩句話:
就將 1 到 107 這些數的位數都算出來了,耗時瞬間。
c 語言會更快。
如果是算[1...n]的ln(n!)值的話,那麼通過查表按序從ln(1)算到ln(n)求和的話,每個n只用算一次,比斯特林快,斯特林法用於算單個ln(n!)無疑是最快的。
求n!的位數
用log10 n 1向下取整可以求n的位數,若要求n 的位數,可以用log10 n 1 log10 1 log10 2 log10 3 log10 n 1 向下取整 例 蒜頭君對階乘產生了興趣,他列出了前 10個正整數的階乘以及對應位數的表 nn 位數1 1 1 2 2 1 3 6 1 4 24 2...
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...
求n的階乘的位數
o型血的人大多數是行動派,鄭微更是將這個特徵發揮到了極致。次日上課,阮阮前所未有地發現她在課堂上奮筆疾書,大為驚訝,便湊過去問了一聲,在寫什麼呀?鄭微大大方方地向阮阮展示了她一早上的智慧型結晶,阮阮看了看,俘虜陳孝正詳細行動攻略 她念完,頓時無語。挺漂亮的一本嶄新小本本,上面已經洋洋灑灑地寫了將近十...