阶乘末尾零的个数由因子5的总数决定,因因子2恒多于5;需累加n÷5、n÷25、n÷125…直至除数超过n,时间复杂度o(log₅n)。

为什么阶乘末尾的零只由因子5决定
阶乘末尾的零来自 10 = 2 × 5,而阶乘中因子2的数量永远多于因子5(比如每两个数就有一个偶数),所以真正限制零的个数的是因子5的总数量。注意:像 25、125 这样的数会贡献多个5(25 = 5² 贡献两个,125 = 5³ 贡献三个),不能只除一次。
用循环累加 n / 5、n / 25、n / 125…
这是最常用且高效的做法,时间复杂度 O(log₅ n),不涉及大数运算,也无需计算完整阶乘(对大 n 来说根本不可行)。
实操要点:
- 初始化计数器为 0
- 用变量
powerOf5 = 5,每次循环后乘以 5 - 只要
powerOf5 ,就将 <code>n / powerOf5(整除)加到计数器中 - 整除是关键:C++ 中
int除法天然截断,不用额外取整
int trailingZeroes(int n) {
int count = 0;
for (long long p = 5; p
<h3>容易踩的坑:<code>int</code> 溢出和边界值</h3>
<p><code>p *= 5</code> 在循环中可能溢出——比如 <code>n</code> 接近 <code>INT_MAX</code> 时,<code>p</code> 下一次乘5前还是合法的,乘完就变成负数,导致循环失控。所以必须用 <code>long long</code> 存 <code>p</code>(哪怕 <code>n</code> 是 <code>int</code>)。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img
src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a>
<p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<p>其他常见问题:</p>
-
n = 0或n = 1时结果是 0,代码自然覆盖,无需特判 - 别写成
while (n > 0) { count += n / 5; n /= 5; }—— 这虽然等价,但修改了原参数,语义不清,还可能误导人以为在“分解 n” - 不要尝试用
std::factorial(n)(C++ 标准库根本没有这个函数)
如果真要验证小数字,可以手算对比
例如 n = 25:
-
25 / 5 = 5(5,10,15,20,25 各一个5) -
25 / 25 = 1(25 额外再贡献一个5) - 总计 6 个零 →
25! = 15511210043330985984000000,末尾确实 6 个零
超过 n ≈ 20 就别手动算阶乘了,数值增长太快,重点始终是统计因子5的个数——这才是本质,不是“算阶乘再数零”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










