1. 程式人生 > >LeetCode 172.FactorialTrailingZeroes(階乘後的零)

LeetCode 172.FactorialTrailingZeroes(階乘後的零)

題目

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

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

示例2

輸入: 5
輸出: 1
解釋: 5! = 120, 尾數中有 1 個零.

說明: 演算法的時間複雜度應為 O(logn)O(log n)

方法一(錯誤的)

求出 n!n! 的值或者在求的過程中,遇到末尾有0,先除以10來減小數,雖然該演算法原理上可以行,但是有兩個問題,一、時間複雜度為 O(n)O(n),二、結果不對,出現這個問題的原因是程式語言每種型別有自己的陣列範圍,因此會溢位。所以該方法實際不可行

方法二

考慮一個問題,位數為零是由2*5產生的,而吧每個數分解,出現5的次數必出現2的次數要少很多,因此,我們通過統計有多少個 5 即可判斷尾數有多少個 0.先上程式碼在將原理

public class LeetCode_172 {
    public int trailingZeroes2(int n) {
        int count = 0;
        while (n > 0) {
            count += n / 5;
            n /= 5;
        }

        return count;
    }

    public static void main(String[] args) {
        LeetCode_172 leetCode = new LeetCode_172();
        System.
out.println(leetCode.trailingZeroes(3)); System.out.println(leetCode.trailingZeroes(5)); System.out.println(leetCode.trailingZeroes(16)); } }

首先我們先統計n 包含一個5的個數,然後統計包含兩個5的個數,依次類推。比如:35!,包含一個5的個數為5,10, 15, 20, 25, 30, 35,即35/5 = 7個,然而當我們遇到25的元素時,裡面包含兩個5,所以通過 n/52n/5^2 ,更大的數一次類推,當 5k>

n5^k > n時即停止,在上面程式碼中表現為n>0;

致謝