zoukankan      html  css  js  c++  java
  • [LeetCode] 172. 阶乘后的零

    题目链接 : https://leetcode-cn.com/problems/factorial-trailing-zeroes/

    题目描述:

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

    示例:

    示例 1:

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

    示例 2:

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

    说明: 你算法的时间复杂度应为 O(log n) 。

    思路:

    找规律!

    我们先用程序,暴力跑一下,

    5 120
    6 720
    7 5040
    8 40320
    9 362880
    10 3628800
    11 39916800
    12 479001600
    13 6227020800
    14 87178291200
    15 1307674368000
    16 20922789888000
    17 355687428096000
    18 6402373705728000
    19 121645100408832000
    20 2432902008176640000
    21 51090942171709440000
    22 1124000727777607680000
    23 25852016738884976640000
    24 620448401733239439360000
    25 15511210043330985984000000
    26 403291461126605635584000000
    27 10888869450418352160768000000
    28 304888344611713860501504000000
    

    发现能在末尾形成0,来自因子25 ,只有有5,就一定存在一个数可以拆成2(4,6,8)乘以某个数。这样末尾就有0了。

    所以,我们前n数能拆成多少个5出来。

    n =5时候,可以拆出 1

    n=10,拆出2....

    但是,这里n = 25,可以拆出6而不是5,是因为 25自身能多拆一个

    还有125。。。

    相当于 n / 5 + n/ 25 + n /125 ...

    (frac{frac{frac{n}{5}}{5}}{5})

    所以,代码如下

    递归:

    class Solution:
        def trailingZeroes(self, n: int) -> int:
        	return  n // 5 + self.trailingZeroes(n // 5) if n != 0 else 0
    

    非递归:

    class Solution:
        def trailingZeroes(self, n: int) -> int:
            res = 0
            while n > 0:
                n //= 5
                res += n
            return res
    
  • 相关阅读:
    2019 SDN阅读作业
    第01组 Alpha冲刺(4/6)
    第01组 Alpha冲刺(3/6)
    第01组 Alpha冲刺(2/6)
    2019 SDN上机第3次作业
    第01组 Alpha冲刺(1/6)
    2019 SDN上机第2次作业
    第01组 团队Git现场编程实战
    1755: [Usaco2005 qua]Bank Interest
    3386/1752: [Usaco2004 Nov]Til the Cows Come Home 带奶牛回家
  • 原文地址:https://www.cnblogs.com/powercai/p/11328803.html
Copyright © 2011-2022 走看看