5 kyu
給定一個參數 n,計算給定數字 n 的階乘結果,結尾零的數量。
function zeros(n) {
let log = 1;
let sum = 0;
while (Math.pow(5, log) <= n) {
sum += Math.floor(n / Math.pow(5, log));
log++;
}
return sum;
}
題目中直接指出不應該實際去計算階乘,就想這或許是以數學為概念的題型。
最佳解也同樣是以數學概念實作。
根據查驗到的方法,相乘會出現零的結果,是由 2 x 5 得來的;然而 2 的倍數明顯比 5 多,所以5 是尾 0 的關鍵;也就是說計算對於 n 的階乘 n!,可以找到之中包含多少個 5。
但對於階乘來說, 5 x 2 = 10,25 ⇒ 5 x 5,也會有與 2 的倍數相乘取得尾數 0 的可能。
while 條件 Math.pow(5, log)
是否小於等於 n。
在迴圈中,將 n 除以 Math.pow(5, log)
的商,即 Math.floor(n / Math.pow(5, log))
;加到 sum 中。這表示將 n 中包含的 5 的個數加到總數;log++
,以處理下一個 5 的次方。
返回 sum
,即為 n
階乘中包含的 5 的總數,也就是末尾零的數量。
以前學生時期學數學,只覺得用一堆奇怪符號實作不知道在哪裡可以用得上的公式。
但其實數學的範圍幅員遼闊,影響的產業也甚多;
甚至開始學程式之後,也覺得數學是不可或缺的基本概念。
仔細想想,打造邏輯思考跟變通能力也是數學的附加(或主要)價值吧?