zoukankan      html  css  js  c++  java
  • 【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/

  • 相关阅读:
    IDEA2019破解版安装
    Docker (一)安装与基本命令
    js导出PDF
    python入门笔记一安装
    微信内关闭当前页面
    微信一些网页
    内网穿透工具:钉钉HTTP内网穿透使用详解
    html生成二维码,qr
    IDEA无法正常启动(打不开&报错)
    微信测试号
  • 原文地址:https://www.cnblogs.com/flix/p/13276476.html
Copyright © 2011-2022 走看看