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 的个数,降低时间复杂度。
所有解法
- 直接计算阶乘再统计零:先计算
n!的值,再统计结果中尾随零的数量。但当n较大时,阶乘结果会非常大,容易导致溢出,且时间复杂度高。 - 计算因子 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(log5n)O(\log_{5}n)O(log5n)。 - 空间复杂度:只使用了常数级的额外空间,空间复杂度为 O(1)O(1)O(1)。
157

被折叠的 条评论
为什么被折叠?



