172. 阶乘后的零

172. 阶乘后的零

题目叙述

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

示例 1

输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0

示例 2

输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0

示例 3

输入:n = 0
输出:0
模式识别

本题要求计算 n! 结果中尾随零的数量。由于一个尾随零是由因子 2 和因子 5 相乘得到的,而在 n! 中因子 2 的数量远多于因子 5 的数量,所以问题可转化为计算 n! 中因子 5 的个数。

考点分析
  • 数学思维:理解阶乘中尾随零的产生原理,即由 2 和 5 相乘得到,且 2 的数量多于 5 的数量,所以重点关注 5 的因子个数。
  • 算法优化:避免直接计算阶乘,通过数学方法直接计算因子 5 的个数,降低时间复杂度。
所有解法
  1. 直接计算阶乘再统计零:先计算 n! 的值,再统计结果中尾随零的数量。但当 n 较大时,阶乘结果会非常大,容易导致溢出,且时间复杂度高。
  2. 计算因子 5 的个数:通过不断除以 5 来统计 n! 中因子 5 的个数,这是最优解法。
最优解法(计算因子 5 的个数)的 C 语言代码
// 该函数用于计算 n! 结果中尾随零的数量
// 参数 n 为要计算阶乘的整数
int trailingZeroes(int n) {
    // 初始化计数器,用于统计因子 5 的个数
    int count = 0;
    // 当 n 大于 0 时,继续循环
    while (n > 0) {
        // n 除以 5 得到的商表示当前能贡献因子 5 的个数
        // 例如,当 n = 25 时,25 包含 5 个 5 的倍数(5, 10, 15, 20, 25)
        n /= 5;
        // 将当前能贡献的因子 5 的个数累加到计数器中
        count += n;
    }
    // 返回统计得到的因子 5 的个数,即 n! 结果中尾随零的数量
    return count;
}
复杂度分析
  • 时间复杂度:该算法只需要不断将 n 除以 5,直到 n 变为 0,因此时间复杂度为 O(log⁡5n)O(\log_{5}n)O(log5n)
  • 空间复杂度:只使用了常数级的额外空间,空间复杂度为 O(1)O(1)O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请向我看齐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值