给定一个整数 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
提示:
0 <= n <= 104
统计因子 5:
class Solution {
public:
int trailingZeroes(int n) {
int count = 0;
// 统计 n! 中的因子 5 的个数
while (n >= 5) {
n /= 5;
count += n;
}
return count;
}
};
基于尾随零的产生机制:每有一个因子 10,就会在数的末尾增加一个尾随零。而 10 可以拆分成 2 * 5,因此我们只需要关注阶乘中有多少对 2
和 5
乘积。
在阶乘 n! = n * (n - 1) * ... * 1
中,因子 2
的数量总是比因子 5
的数量多,因为每个偶数都会贡献一个 2
。因此,尾随零的数量由因子 5 的数量决定。换句话说,阶乘中有多少个 5
,就有多少个尾随零。
直接计算阶乘导致整数溢出,解答错误:
class Solution {
public:
int trailingZeroes(int n) {
if(n==0) return 0;
long long ans=1;
for(int i=n;i>0;i--){
ans *=i;
}
int f=0;
while(ans%10==0){
f++;
ans/=10;
}
return f;
}
};
计算阶乘时,数值迅速变得非常大,超出了 long long
类型可以存储的范围。为了避免溢出问题,并不需要实际计算阶乘本身。可以通过直接统计 n!
中有多少个因子 5
来解决问题。