Factorial Trailing Zeroes 階乘後的零

麥田裡的哈士奇發表於2018-11-11

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

示例 1:

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

示例 2:

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

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

思路:

基本idea:

       1:尾0來自於10

       2:10來自於2*5

       3:我們需要計算所有以5和2為乘積因子的值,比如:4*5=20,5*6=30

       4:所以我們需要計算以5為因子的數,因為有足夠多的其他數和5配對形成10(因為5這個因子只有每5個數才會出現,而2的倍數只要是偶數就滿足,比如對於n=46,滿足是5的倍數的只有:5,10,15,20,25,30,35,40,45,而滿足2的倍數的是所有偶數(除了0),數目遠大於5的倍數)

例子一:

有多少5的乘積因子在1~23之間,有5,10,15和20,所以有4個5的乘積因子,這些乘積因子和2的倍數配對,形成4個10,所以23有4個尾導零

例子二:

在1~100間有多少個5的乘積因子?因為100/5=20,所以由20個5,但是注意:對於25而言,25=5*5,相當於25這個數貢獻了2個5,所以我們還需要計算有多少個25,100/25=4,所以一共有:20+4=24個尾導零

例子三:

對於4617有多少個尾導零?

同理,有4617/5=923.4,有923個因子5

有4617/(5^2)=184.68,有184個因子5^2

有4617/(5^3)=36.9,有36個因子5^3

有4617/(5^4)=7.38,有7個因子5^4

有4617/(5^5)=1.47,有1個因子5^5

有4617/(5^6)=0.29,有0個因子5^6    迴圈結束

所以一共有:923+184+36+7+1=1151個尾導零

參考程式碼:

class Solution {
public:
    int trailingZeroes(int n) {
        int result = 0;
        for (long long int i = 5; n / i > 0; i *= 5) {
            result += n / i;
        }
        return result;
    }
};

 

相關文章