📜  Golang 程序计算一个数的因子中的尾随零

📅  最后修改于: 2021-10-25 02:50:39             🧑  作者: Mango

给定一个整数 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。

// 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