LeetCodeAnimation/0172-Factorial-Trailing-Zeroes/Article/0172-Factorial-Trailing-Zeroes.md

79 lines
2.3 KiB
Java
Raw Normal View History

2020-04-17 15:39:41 +08:00
# LeetCode第 172 号问题阶乘后的零
> 本文首发于公众号图解面试算法 [图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>) 系列文章之一。
>
> 同步博客https://www.algomooc.com
题目来源于 LeetCode 上第 172 号问题阶乘后的零题目难度为 Easy目前通过率为 38.0%
### 题目描述
给定一个整数 *n*返回 *n*! 结果尾数中零的数量
**示例 1:**
```
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零
```
**示例 2:**
```
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
```
**说明:** 你算法的时间复杂度应为 *O*(log *n*)
### 题目解析
题目很好理解数阶乘后的数字末尾有多少个零
最简单粗暴的方法就是先乘完再说然后一个一个数
事实上你在使用暴力破解法的过程中就能发现规律 ** 9 个数字中只有 2它的倍数 5 它的倍数相乘才有 0 出现**
所以现在问题就变成了这个阶乘数中能配 **多少对 2 5**
举个复杂点的例子
` 10 = 2 * 2 * 2 * 5 * 2 * 3 * 2 * 2 * 2 * 2 * 5`
10这个阶乘数中可以匹配两对 2 * 5 所以10末尾有 2 0
可以发现一个数字进行拆分后 2 的个数肯定是大于 5 的个数的所以能匹配多少对取决于 5 的个数好比现在男女比例悬殊最多能有多少对异性情侣取决于女生的多少
那么问题又变成了 **统计阶乘数里有多少个 5 这个因子**
需要注意的是 25125 这样的不只含有一个 5 的数字的情况需要考虑进去
比如 `n = 15`那么在 `15!` `3` `5` (来自其中的`5`, `10`, `15`) 所以计算 `n/5` 就可以
但是比如 `n=25`依旧计算 `n/5` 可以得到 `5` `5`分别来自其中的`5, 10, 15, 20, 25`但是在 `25` 中其实是包含 `2 ` `5` 这一点需要注意
所以除了计算 `n/5` 还要计算 `n/5/5 , n/5/5/5 , n/5/5/5/5 , ..., n/5/5/5,,,/5`直到商为0然后求和即可
### 代码实现
```java
public class Solution {
public int trailingZeroes(int n) {
return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);
}
}
```
![](../../Pictures/qrcode.jpg)