leetcode之270階乘後的零Golang
阿新 • • 發佈:2020-11-23
題目描述
給定一個整數 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 }