172. 阶乘后的零

这篇博客探讨了如何高效地计算阶乘结果中尾部零的个数。通过解析不同解题思路,包括直接计算、关注5的因子以及使用递归,展示了如何优化算法以避免超时。重点在于理解阶乘中0的来源是2和5的相乘,特别是5因子的计数,从而提供了一个更高效的解决方案。
摘要由CSDN通过智能技术生成

题目描述:给定一个整数 n,返回 n! 结果尾数中零的数量。
解题思路一:直接计算阶乘,然后计算0的个数,这个方法会超时,代码如下:

class Solution:
    def trailingZeroes(self, n: int) -> int:
        accm = 1
        ans = 0
        for i in range(2, n+1):
            accm *= i
            while(accm % 10 == 0):
                ans += 1
                accm //= 10
        return ans

解题思路二:0实际是由2和5相乘得到,阶乘可以转化为每个数的因子相乘,而5的个数远远少于2的个数,因此计算1到n之间的数有多少个5的因子即可,代码如下:

class Solution:
    def trailingZeroes(self, n: int) -> int:
        ans = 0
        for i in range(5, n+1):
            while(i % 5 == 0):
                ans += 1
                i //= 5
        return ans

解题思路三:一次计算只有一个因子5的数目即,n/5,再计算有两个因子5的数目,即n/25,有两个因子5的数在第一次就散有一个因子5的时候都已经加过了,所以后面每次加一次即可,n/25即可以不断5倍的增加除数,也可以每次讲被除数除以5,代码如下:

class Solution:
    def trailingZeroes(self, n: int) -> int:
        ans = 0
        while(n):
            n //= 5
            ans += n
        return ans

下面这个代码思路和上面一样,只是用递归进行了实现,代码如下:

class Solution:
    def trailingZeroes(self, n: int) -> int:
        return n//5 + self.trailingZeroes(n//5) if n > 0 else 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值