📜  N *(N – 2)*(N – 4)*…中的尾随零数。(1)

📅  最后修改于: 2023-12-03 14:44:32.287000             🧑  作者: Mango

计算 N! 中的尾随零数

什么是尾随零数?

在一个数的末尾连续出现零的个数被称为尾随零数。对于一个正整数 N 的阶乘(N!),尾随零数就是其末尾的零的个数。

如何计算 N! 中的尾随零数?

一个数的尾随零数,取决于它的因数中 10 的个数。在 N!中,10 的因子来自于 2 和 5 的乘积。2 可以看作是偶数中含有的 5 的个数。因此,我们可以规约问题为找出 1 到 N 之间的数中,有多少个因数包含 5 即可。

如果直接计算,会存在数据范围过大的问题。因此,我们需要寻找一种更加高效的计算方法。观察可以发现,每隔 5 个数有一个数包含 5,每隔 25 个数有一个数包含 5,并依此类推。因此,我们可以使用递归或循环的方法依次计算5、25、125等时所得到的 5 的因子个数,最后累加即为答案。

具体实现
def trailing_zeros(num):
    """
    计算 N! 中的尾随零数
    """
    if num < 0:
        return -1 # 输入不合法

    count = 0
    while num >= 5:
        num //= 5
        count += num

    return count
复杂度分析

时间复杂度:$O(\log_5 N)$。因为我们每隔 5 个数计算一次,所以时间复杂度为 $\log_5 N$。

空间复杂度:$O(1)$。我们只需要常量空间来存储变量,所以空间复杂度为 $O(1)$。

总结

计算 N! 中的尾随零数,需要先计算 N! 中包含多少个因子 5。使用递归或循环的方法,每隔 5 个数、25 个数、125 个数...计算 5 的因子个数,最后累加即为答案。

如果对时间复杂度有要求,可以采用递归方式计算,对于较小的数直接计算,对于较大的数简化计算。如果对空间复杂度有要求,可以采用循环方式计算,只需要常量空间即可。