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
}
posted @ 2020-11-23 09:53  胖胖咩  阅读(117)  评论(0)    收藏  举报