leetcode之270阶乘后的零Golang
题目描述
给定一个整数 n,返回 n! 结果尾数中零的数量。
示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明: 你算法的时间复杂度应为 O(log n) 。
算法
最开始我使用的方法是一边计算阶乘,一边计算零的个数的方法,但是这种方法毫无疑问的报错了,我猜测就算不报错也会超时吧。
报错的原因很简单,就是当数n大了以后,可能会超出int类型的表示范围,可能会导致结果变为负数或者因溢出而造成的截断误差
所以后来采用了如下的方法:
我们可以想在什么情况下乘积的末尾会是零,自然就是因数包含了类似于10这种自身带有0的数和类似于5这种自身包含5的数
- 当自身包含10的时候,我们只需要找出这个数中的10的个数即可
- 当自身包含5的时候,我们也只需要找出这个数中5的个数就可以了,为什么呢?因为5乘以一个偶数必然是包含一个0的,而在计算阶乘中,偶数的个数明显比包含的5的个数多,所以对于每一个5我们都默认能够找到一个偶数与之相乘
- 当自身同时包含10和5的时候,我们只需要找出里面10和5的个数就可以了,建议优先找10,当然优先找5也可以
代码
func trailingZeroes(n int) int {
if n <= 0 {
return 0
}
count := 0
for i := 1; i <= n; i++ {
number := i
if number%5 == 0 {
for {
count++
if number%10 == 0 {
number /= 10
} else {
number /= 5
}
if number%5 != 0 {
break
}
}
}
}
return count
}
浙公网安备 33010602011771号