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
    
  • 相关阅读:
    算法
    什么叫「人的格局」?是否有必要培养大的格局或怎么培养?
    套接字
    信号量 P V测试详解
    Emacs快速入门
    Emacs 从入门到精通
    Linux多进程之间的文件锁
    mysql 登录报错:ERROR 1045 (28000)
    类职责协作模型
    .Netcore使用Session
  • 原文地址:https://www.cnblogs.com/powercai/p/11328803.html
Copyright © 2011-2022 走看看