📜  门|门 IT 2006 |第 32 题(1)

📅  最后修改于: 2023-12-03 15:28:48.216000             🧑  作者: Mango

门|门 IT 2006 第32题

本题为门|门 IT 2006第32题,要求编写一个程序,输入一个正整数n,输出n!末尾有几个0。

解题思路

末尾的0是由2和5相乘得到的,因此我们只需要计算n!中2和5的个数,取较小的值即可。

具体做法是将n!分解成素因数,例如:

  • 10! = 2^8 * 3^4 * 5^2 * 7
  • 20! = 2^18 * 3^8 * 5^4 * 7^2 * 11 * 13 * 17 * 19

在n!的素因数中,2的个数比5多,因此我们只需要计算5的个数即可。计算5的个数可以使用如下公式:

  • n/5 + n/25 + n/125 + ...

每个n/5表示1~n中5的倍数的个数,n/25表示5的倍数中还有一个5的个数,n/125表示5的倍数中还有两个5的个数,以此类推。

代码实现

以下是Python实现:

def trailing_zeros(n):
    zeros = 0
    i = 5
    while n >= i:
        zeros += n // i
        i *= 5
    return zeros

以下是Java实现:

public static int trailingZeros(int n) {
    int zeros = 0;
    int i = 5;
    while (n >= i) {
        zeros += n / i;
        i *= 5;
    }
    return zeros;
}
使用方法

调用函数trailing_zeros(n)或trailingZeros(n),其中n为正整数,返回n!末尾的0的个数。