172. 阶乘后的零

  1. [题目链接](172. 阶乘后的零 - 力扣(LeetCode))

  2. 解题思路:首先得知道,n!一共有多少个0,取决于什么。取决于1~n所有2的因数的个数和5的因数的个数。因为0,其实就是2*5得到的。

    • 怎么用对数时间计算1~n,2因子的个数?
      • 一种特殊的是2的幂次的,比如2、4、8、16,含有2因子的个数分别是1,2,3,4
      • 另一种不是2的幂次,但是含有2这个因数,比如:6,10,12,14,含有2因子的个数分别是:1,1,2,1
      • 好像没什么规律?其实不然,当我们算2的幂次的时候,假如n=16,现在计算的是2,用n/2,得到8,这8代表有8个因子,那么这8个因子分别从哪来的?从2(1)、4(1)、8(1)、16(1)、6(1)、10(1)、12(1)、14(1),括号中的代表因子个数。然后我们再计算2^2也就是4,然后再n/4,得到4,代表有4个因子,这4个因子哪来的?从4(1)、8(1)、16(1)、12(1),然后再计算2^3也就是8,用n/8,得到2,代表有2个因子,这2个因子哪来的,从8(1)、16(1),然后再计算2^4也就是16,用n/16,也就是1,代表有1个因子,这1个因子哪来的,从16(1)来的。
      • 也就是说,在分别计算幂次的时候,把所有的2因子提取出来了
    • 计算5的因子个数同理
  3. 代码

    class Solution:
    
        # 计算1~n有几个num的因子
        def count_factors(self, n, factor):
            count = 0
            power = factor
            while power <= n:
                count += n // power
                power *= factor
            return count
    
    
        def trailingZeroes(self, n: int) -> int:
            count_2 = self.count_factors(n, 2)
            count_5 = self.count_factors(n, 5)
            return min(count_2, count_5)
    
posted @ 2025-01-09 10:58  ouyangxx  阅读(15)  评论(0)    收藏  举报