1. 程式人生 > 其它 >leetcode刷題-階乘後的零

leetcode刷題-階乘後的零

技術標籤:每日一題java

題目

給定一個整數 n,返回 n! 結果尾數中零的數量。

示例 1:

輸入: 3
輸出: 0
解釋: 3! = 6, 尾數中沒有零。

示例 2:

輸入: 5
輸出: 1
解釋: 5! = 120, 尾數中有 1 個零.
說明: 你演算法的時間複雜度應為 O(log n) 。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/factorial-trailing-zeroes
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

題解分析

結尾0的個數與1、…、n中因子分解包含5的個數相關,比如

1、2、3、4、5、...、10

能貢獻因子5的只有 5、10,一個貢獻2個5因子(5 = 5 * 1,10 = 2 * 5),故最終結果為2。

因此,

再對於1、…、n,只需要考慮5、10、15、…、5 * x,即

1 * 5、2 * 5、...、x * 5

上面數列都除於5(每個數都貢獻1個5因子),一共貢獻了 n / 5 = x個,數列變成了

1、2、...、x

變成了求解遞迴問題:

    public int trailingZeroes(int n) {
        if (n < 4) {
            return 0;
        }
        int x = n / 5;
        return x + trailingZeroes(x);
    }

等價於:

class Solution {
    public int trailingZeroes(int n) {
        int sum = 0;
        while (n > 0) {
            n /= 5;
            sum += n;
        }
        return sum;
    }
}