1. 程式人生 > 其它 >LeetCode 0172 Factorial Trailing Zeroes

LeetCode 0172 Factorial Trailing Zeroes

原題傳送門

1. 題目描述

2. Solution 1

1、思路分析
區間[1, n]中質因子p的倍數有\(n_1 = \lfloor \frac{n}{p} \rfloor\)個,這些數至少貢獻了\(n_1\)個質因子。\(p^2\)的倍數有\(n_2=\lfloor \frac{n}{p^2} \rfloor\)個,由於這些數已經是\(p\)的倍數了,為了不重複統計\(p\)的個數,僅考慮額外貢獻的質因子個數,即這些數額外貢獻了至少\(n_2\)個質因子\(p\)。以此類推,[1, n]中質因子\(p\)的個數為 \(\sum_{k=1}^{ \infty}\lfloor \frac{n}{p^k} \rfloor\)


上式表明:
1> n不變,p越大,質因子個數越少,因此[1, n]中質因子5的個數不會大於質因子2的個數;
2> [1, n]中質因子5的個數為: \(\sum_{k=1}^{\infty} \lfloor \frac{n}{5^k} \rfloor < \sum_{k=1}^{\infty} \frac{n}{5^k} = \frac{n}{4} = O(n)\)
程式碼實現時,由於 \(\lfloor \frac{n}{5^k} \rfloor = \lfloor \frac{\lfloor \frac{n}{5^{k-1}} \rfloor }{5} \rfloor\)

因此,可以通過不斷將n除以5,並累加每次除後的n,來得到答案。

2、程式碼實現

package Q0199.Q0172FactorialTrailingZeroes;

/*
    Iteration
 */
public class Solution2 {
    public int trailingZeroes(int n) {
        int res= 0;
        while (n >= 5) {
            n = n / 5;
            res += n;
        }
        return res;
    }
}

3、複雜度分析


時間複雜度: O(log n)
空間複雜度: O(1)

3. Solution 2

1、思路分析
Solution1的遞迴實現。
2、程式碼實現

package Q0199.Q0172FactorialTrailingZeroes;

/*
    Because all trailing 0 is from factors 5 * 2.
    But sometimes one number may have several 5 factors, for example, 25 have two 5 factors, 125 have tree 5 factors.
    In the n! operation, factors 2 is always ample. So we just count how many 5 factors in all number from 1 to n.
 */
public class Solution {
    // recursion
    public int trailingZeroes(int n) {
        return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);
    }
}

3、複雜度分析
時間複雜度: O(log n)
空間複雜度: O(log n)