快手面试题,计算n!末尾连续0的个数
解题思路
要求n的阶乘中末尾含有多少个0。例如n=10,n!=3628800,那么n!末尾有两个0。直接计算n!的值显然不合适,因为n!数值太大,很容易溢出。
所以我们可以这样考虑:
两个大数字相乘,都可以拆分成多个质数相乘,而质数相乘结果尾数为0的,只可能是2*5。如果想到了这一点,那么就可以进一步想到:两个数相乘尾数0的个数其实就是依赖于2和5因子的个数。又因为每两个连续数字就会有一个因子2,个数非常充足,所以此时只需要关心5因子的个数就行了。
# -*- coding:utf-8 -*-
# n!末尾连续0的个数
class Solution():
def zero_num(self,n):
if n == 0:
return 0
count = 0
for j in range(n+1):
k = j
while k%5 == 0 and k > 0:
count += 1
k = k/5
return count
s = Solution()
s.zero_num(50) # 50! = 30414093201713378043612608166064768844377641568960512000000000000,末尾有12个0
>> 12