📅  最后修改于: 2023-12-03 15:42:16.510000             🧑  作者: Mango
本题是门(GATE-CS-2007) 第 43 题,是一道面试常见的算法题,也是考察程序员能力的一道典型题目。
给定一个正整数n,计算从1到n所有数的阶乘的结果的末尾为零的个数。
例如,当n = 5时,从1到5所有数的阶乘为1 * 2 * 3 * 4 * 5 = 120。其中,末尾有1个零。因此,从1到5的所有数的阶乘结果的末尾有1个零。
请实现一个函数count_trailing_zeros(n),返回从1到n所有数的阶乘的结果的末尾为零的个数。
要求从1到n所有数的阶乘的结果的末尾为零的个数。我们可以想到,当一个数字n的阶乘末尾有k个零时,说明n的阶乘是2的k次方和5的k次方的乘积。因此,我们可以将n的阶乘分解成p1的x1次方,p2的x2次方,……,pk的xk次方的形式,其中,pi是质数,xk是正整数。
对于2的k次方和5的k次方的乘积,我们只需要将对于n的阶乘中2和5的质因子进行分解,分别统计2和5的个数,取较小值为n的阶乘的末尾0的个数即可。
因为2的个数一定比5的个数多,因此我们只需要统计5的个数即可。具体实现可以使用循环递归的方法,求n!中有多少个5的因子即可。
def count_trailing_zeros(n):
count = 0
while n >= 5:
n //= 5
count += n
return count
本题通过分解2和5的质因子实现了对于从1到n所有数的阶乘的结果的末尾为零的个数的统计,具有较好的时间、空间复杂度。