给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3 输出: 0 解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5 输出: 1 解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。
分析:
一开始,最自然的想法就是先定义个阶乘函数,然后发现时间太长无法通过。
代码如下:
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
n=5
result = factorial(n)
result = str(result)[::-1]
count = 0
for i in range(len(result)):
if result[0] != '0':
print(0)
else:
if result[i] == '0':
count += 1
continue
if result[i] != '0':
print(count)
发现这样不行之后开始分析方法,所以我们可以将阶乘进行因式分解,比如5!=1*2*3*4*5=1*2*3*2*2*5,共有1对2*5,所以结果就只有一个0嘛;有几对2*5,结果就有几个0!
所以问题就简化为找有几对2*5,能不能进一步简化捏?必须可以啊!
我们发现2的个数是远远多于5的,所以最终简化为了找出5的个数!
如果找出5的个数呢,比如20!,从1到20,共有5,10,15,20,共有4个5,即结尾0的个数为n/5!
这样就ok么?当然没ok,25!结果不只是25/5=5个0,25结果有6个0,因为25=5*5,有两个5。所以结果f(n)=n/5+f(n/5)!
最终的AC代码如下:
class Solution:
def trailingZeroes(self, n):
"""
:type n: int
:rtype: int
"""
if n < 5:
return 0
if n < 10:
return 1
return (n // 5 + self.trailingZeroes(n//5))