172. Factorial Trailing Zeroes

问题

Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.

例子

10
24

分析

n! = 1*2*3*...*n. 要让n!的末尾有0,1...n中必须有若干数字有2和5的因子,因为2*5=10。由于因子2的数量肯定要远远多于因子5的数量,所有我们只考虑因子5就行了。进一步来说,n!末尾0的数量就等于1...n这n个数中所含有的因子5的数量。

举个例子,27! = 1*2*3...*25*6*27,包含因子5的个数=1(5=1X5) + 1(10=2X5) + 1(15=3X5) + 1(20=4X5) + 2(25=5X5)=6,所以27! 的末尾有6个0.

那么如果求1...n这n个数所含因子5的个数呢?我们首先把n除5,得到的是1...n中只有一个因子5的数的个数;把n除25,得到的是1...n中只有两个个因子5的数的个数;把n除125,得到的是1...n中只有三个个因子5的数的个数......把n除5m,得到的是1...n中只有m个个因子5的数的个数,直到5m>n。然后把所有这些个数加起来,就是1...n这n个数所含因子5的个数。

要点

要能看出来n!末尾0的数量 = 1...n这n个数中所含有的因子5的数量

时间复杂度

O(logn)

空间复杂度

O(1)

代码

迭代版

class Solution {
public:
    int trailingZeroes(int n) {
        int count = 0;
        // 注意i *= 5可能溢出,所以i定义为long long
        for (long long i = 5; i <= n; i *= 5)
            count += n / i;
        return count;
    }
};

递归版

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

你可能感兴趣的:(172. Factorial Trailing Zeroes)