给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

 

示例 1:

输入:n = 3 输出:0 解释:3! = 6 ,不含尾随 0 示例 2:

输入:n = 5 输出:1 解释:5! = 120 ,有一个尾随 0 示例 3:

输入:n = 0 输出:0  

提示:

0 <= n <= 104

题解: 这道题的第一个解法其实很好想,因为能够产生0的只有2和5,所以统计2和5的个数就可以了。

class Solution {
public:
    int trailingZeroes(int n) {
        int cnt2 = 0, cnt5 = 0;
        for(int i = 1; i <= n; i++){
            int tmp = i;
            while(tmp % 2 == 0){
                cnt2++;
                tmp /= 2;
            }
            while(tmp % 5 == 0){
                cnt5++;
                tmp /= 5;
            }
        }
        return min(cnt2, cnt5);
    }
};

但是还有一个比较巧妙的方法,因为2的个数肯定比5的多,所以统计5的个数就可以了。

class Solution {
public:
    int trailingZeroes(int n) {
        int ans = 0;
        for (int i = 5; i <= n; i += 5) {
            for (int x = i; x % 5 == 0; x /= 5) {
                ++ans;
            }
        }
        return ans;
    }
};

上述方案的时间复杂度为O(n),空间复杂度为O(1)。

但是实际上还有一个更加巧妙的方法,可以将时间复杂度降到O(logn)。 可以通过不断将 n 除以 5,并累加每次除后的 n,来得到答案。

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