📜  门| GATE-CS-2007 |第 43 题(1)

📅  最后修改于: 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所有数的阶乘的结果的末尾为零的个数的统计,具有较好的时间、空间复杂度。