【LeetCode-数学】阶乘后的零

题目描述

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

输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。

输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.

说明:
你算法的时间复杂度应为 O(log n) 。
题目链接: https://leetcode-cn.com/problems/factorial-trailing-zeroes/

思路

直接求阶乘然后数 0 不可行,因为可能溢出,而且计算也比较慢。

首先分析一下:n! = 1*2*3*...*n,如果阶乘中的因子能够被分解为 2 和 5 相乘的形式,则将其分解,所以n! = 1*2*3*...*7*(2*4)*9*(2*5)*...*n,只有 2*5 能产生一个零。所以我们统计 n! 中有多少个 2 和多少个 5 参与相乘就行了。因为 2 的个数大于 5,所以我们只需要看 5 的个数有多少就行了。

假设 n = 100,首先每 5 个数字都能分解出来 1 个 5,这些数字是 5、10、15、20、...、95、100,共 n/5 = 100/5 = 24 个;

有些数字不止能分解为 1 个 5,例如 25,所以对于 5、10、15、20、...、95、100,我们将 5 提出来,得到 5(1、2、3、4、...、20),则 (1、2、3、4、...、20)共 20 个数,又可以提取出 20/5 = 4 个 5,分别是 25、50、75、100,这相当于 100/5/5 = 100/(5^2);

以此类推,直到无法提取 5 为止。

算法如下:

  • 如果 n 不为 0,循环:
    • 结果 ans += (n/5);
    • n /= 5;

代码如下:

class Solution {
public:
    int trailingZeroes(int n) {
        int ans = 0;
        while(n){
            ans += (n/5);
            n /= 5;
        }
        return ans;
    }
};
  • 时间复杂度:O(logn)
  • 空间复杂度:O(1)

参考

1、https://hsutimes.club/article/53/

posted @ 2020-07-09 21:58  Flix  阅读(152)  评论(0编辑  收藏  举报