阶乘后的零

172. 阶乘后的零

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

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

示例 1:

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

示例 2:

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

示例 3:

1
2
输入:n = 0
输出:0

提示:

  • 0 <= n <= 104

进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?

首先肯定不能依赖于把阶乘算出来再去判断有多少个零了,因为阶乘很容易就溢出了,所以先一步一步理一下思路吧。

首先末尾有多少个 0 ,只需要给当前数乘以一个 10 就可以加一个 0。

再具体对于 5!,也就是 5 * 4 * 3 * 2 * 1 = 120,我们发现结果会有一个 0,原因就是 2 和 5 相乘构成了一个 10。而对于 10 的话,其实也只有 2 * 5 可以构成,所以我们只需要找有多少对 5*2。

我们把每个乘数再稍微分解下,看一个例子。

11! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 11 * (2 * 5) * 9 * (4 * 2) * 7 * (3 * 2) * (1 * 5) * (2 * 2) * 3 * (1 * 2) * 1

对于含有 2 的因子的话是 1 * 2, 2 * 2, 3 * 2, 4 * 2 ...

对于含有 5 的因子的话是 1 * 5, 2 * 5...

含有 2 的因子每两个出现一次,含有 5 的因子每 5 个出现一次,所有 2 出现的个数远远多于 5,换言之找到一个 5,一定能找到一个 2 与之配对。所以我们只需要找有多少个 5。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int trailingZeroes(int n) {
int count = 0;

//凑出0必须有2*5,而每出现一个5,必定会有2与之匹配,因为每有一个偶数就有一个2
//例如: 25! = (5 * 5) * 24 * 23... * 5 * 4 * 3 * 2 * 1
for(int i = 1; i <= n; i++){
int N = i;
while(N > 0){
if(N % 5 == 0){
count ++;
N /= 5;
}else{
break;
}
}
}
return count;
}
}

阶乘后的零
http://example.com/2023/06/08/算法/数学相关/4. 阶乘后的0/
作者
PALE13
发布于
2023年6月8日
许可协议