LeetCode(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.

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

分析

题目描述:给定一个整数 n ,求对于 n! 末尾0的个数。

开始看到的时候并没有什么思路,只知道 n!=123...n

那么末尾 0 是怎么产生的呢,必然是 质因数 25 而导致的结果 , 又搜索了网上一些资料:

对n!做质因数分解 n!=2x3y5z...

显然 0 的个数等于 min(x,z) ,并且 min(x,z)==z

证明:

对于阶乘而言,也就是 123...n
[n/k] 代表 1n 中能被 k 整除的个数
那么很显然
[n/2]>[n/5] (左边是逢2增1,右边是逢5增1)
[n/22]>[n/52] (左边是逢4增1,右边是逢25增1)
……
[n/2p]>[n/5p] (左边是逢 2p 增1,右边是逢 5p 增1)
随着幂次 p 的上升,出现 2p 的概率会远大于出现 5p 的概率。
因此左边的加和一定大于右边的加和,也就是 n! 质因数分解中, 2 的次幂一定大于 5 的次幂

此时,便很明了了,结果可以表示为:
n! 后缀0的个数 = n! 质因子中5的个数 = floor(n/5)+floor(n/25)+floor(n/125)+....

AC代码

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

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