172. 阶乘后的零
-
[题目链接](172. 阶乘后的零 - 力扣(LeetCode))
-
解题思路:首先得知道,
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的因子个数同理
- 怎么用对数时间计算
-
代码
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)

浙公网安备 33010602011771号