【LeetCode 172】阶乘后的零(C语言详解 | 数学规律 + 对数时间复杂度)

一、题目描述

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

阶乘定义:

复制代码
n! = n × (n-1) × (n-2) × ... × 3 × 2 × 1

示例

示例 1

复制代码
输入:n = 3
输出:0
解释:3! = 6,没有尾随 0

示例 2

复制代码
输入:n = 5
输出:1
解释:5! = 120,有 1 个尾随 0

示例 3

复制代码
输入:n = 0
输出:0

数据范围

复制代码
0 <= n <= 10^4

进阶要求:设计 O(log n) 时间复杂度的算法。


二、问题关键

尾随 0 的来源是 10

而:

复制代码
10 = 2 × 5

也就是说:

复制代码
只要有一对 (2,5) 就会产生一个 0

例如:

复制代码
2 × 5 = 10 → 产生一个 0

三、为什么只需要统计 5?

n! 中:

  • 偶数很多 → 2 的因子很多

  • 5 的因子比较少

例如:

复制代码
10! = 3628800

里面:

复制代码
2 的数量 >> 5 的数量

因此:

复制代码
尾随 0 的数量 = 5 的因子数量

四、需要注意的特殊情况

某些数提供 多个 5

例如:

复制代码
25 = 5 × 5
125 = 5 × 5 × 5

所以计算公式为:

复制代码
n/5 + n/25 + n/125 + ...

直到为 0。


五、图解理解

n = 25 为例:

第一次统计

复制代码
25 / 5 = 5

说明:

复制代码
5,10,15,20,25

5 个 5


第二次统计

复制代码
25 / 25 = 1

说明:

复制代码
25 = 5 × 5

多贡献 1 个 5


总数

复制代码
5 + 1 = 6

因此:

复制代码
25! 尾随 0 = 6

六、解法一:数学规律(推荐)

核心思路:

不断除以 5。

复制代码
n/5
n/25
n/125
...

时间复杂度:

复制代码
O(log₅ n)

C语言实现

复制代码
int trailingZeroes(int n) {
    int count = 0;

    while (n > 0) {
        n /= 5;
        count += n;
    }

    return count;
}

七、解法二:for循环写法

逻辑完全相同,只是写法不同。

C语言实现

复制代码
int trailingZeroes(int n) {
    int count = 0;

    for (long long i = 5; i <= n; i *= 5) {
        count += n / i;
    }

    return count;
}

过程示例(n=100)

复制代码
100/5  = 20
100/25 = 4
100/125 = 0

结果:

复制代码
20 + 4 = 24

八、错误解法(不推荐)

有些人会真的去计算:

复制代码
n!

例如:

复制代码
5! = 120
10! = 3628800

然后统计末尾 0。

这种方法问题:

1️⃣ 阶乘非常大

复制代码
20! 就已经超过 long long

2️⃣ 时间复杂度高

因此不推荐。


九、复杂度分析

方法 时间复杂度 空间复杂度
数学统计 O(log n) O(1)
暴力阶乘 极高 极高

十、总结

核心思想只有一句话:

复制代码
阶乘尾零 = 统计所有因子5的数量

计算公式:

复制代码
n/5 + n/25 + n/125 + ...

最终实现只需 几行代码 ,时间复杂度 O(log n)

相关推荐
BothSavage6 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn6 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽7 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法