美文网首页
172. Factorial Trailing Zeroes

172. Factorial Trailing Zeroes

作者: RobotBerry | 来源:发表于2017-05-08 09:07 被阅读0次

    问题

    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

          本文链接:https://www.haomeiwen.com/subject/dqqmtxtx.html