给定一个整数 n,编写一个 Go 程序来计算 n 的阶乘中尾随零的数量。
例子:
Input : 7
Output : 1
Explanation: 7! = 5040, which has 1 trailing zero
Input : 10
Output : 2
Explanation: 10! = 3628800, which has 2 trailing zeros
天真的方法:要计算 n! 中的尾随零,一种方法是找到 n 的阶乘,然后使用循环计算尾随零的数量并计算 (n%10==0) 的数量。但是,即使对于 20 这样的小数,阶乘值也大到足以导致整数溢出。
有效的方法:要计算尾随零的数量,首先需要了解是什么导致了数字的阶乘中尾随零。
数字 10 负责尾随零。 10 的质因数分解是 2*5。在任何数的质因数分解中,2 的个数总是大于或等于 5 的个数。因此,只需要在数的质因数分解中找到 5 的个数。
示例 1:当 n = 7 时,7 的质因数分解!是 2^4 * 3^2 * 5^1 * 7^1。质因数分解中 5 的数量是 1。因此,7 中尾随零的数量!是 1。
示例 2:当 n = 10 时,10 的质因数分解!是 2^8 * 3^4 * 5^2 * 7^1。质因数分解中 5 的数量是 2。因此,10 中尾随零的数量!是 2。
trailingZerosCount = floor(n/5) + floor(n/5^2) + floor(n/5^3) + …. + floor(n/5^k) where 5^k <= n
// Golang Program to Count Trailing
// Zeros in Factorial of a Number
package main
import (
"fmt"
)
func trailingZeros(n int) int {
// This function return the number of
// trailing zeros in the factorial of
// a number n.
// The count variable denotes the
// number of trailing zeros in n!
count := 0
// This loop counts the number
// of occurrences of 5 and its
// powers in n!
// Starting with p = 5, the loop
// calculates floor(n/5) + floor(n/25) +
// floor(n/125) + ..... until n/p >0
for p := 5; n/p > 0; p *= 5 {
count += n / p
}
return count
}
// Driver code
func main() {
n := 10
fmt.Printf("The number of trailing zeros"+
" in %v! is %v", n, trailingZeros(n))
}
输出:
The number of trailing zeros in 10! is 2