1. 程式人生 > 實用技巧 >leetcode之270階乘後的零Golang

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
}