【LeetCode-数学】阶乘后的零
题目描述
给定一个整数 n,返回 n! 结果尾数中零的数量。
示例:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.
说明:
你算法的时间复杂度应为 O(log n) 。
题目链接: https://leetcode-cn.com/problems/factorial-trailing-zeroes/
思路
直接求阶乘然后数 0 不可行,因为可能溢出,而且计算也比较慢。
首先分析一下:n! = 1*2*3*...*n
,如果阶乘中的因子能够被分解为 2 和 5 相乘的形式,则将其分解,所以n! = 1*2*3*...*7*(2*4)*9*(2*5)*...*n
,只有 2*5
能产生一个零。所以我们统计 n! 中有多少个 2 和多少个 5 参与相乘就行了。因为 2 的个数大于 5,所以我们只需要看 5 的个数有多少就行了。
假设 n = 100,首先每 5 个数字都能分解出来 1 个 5,这些数字是 5、10、15、20、...、95、100,共 n/5 = 100/5 = 24 个;
有些数字不止能分解为 1 个 5,例如 25,所以对于 5、10、15、20、...、95、100,我们将 5 提出来,得到 5(1、2、3、4、...、20),则 (1、2、3、4、...、20)共 20 个数,又可以提取出 20/5 = 4 个 5,分别是 25、50、75、100,这相当于 100/5/5 = 100/(5^2);
以此类推,直到无法提取 5 为止。
算法如下:
- 如果 n 不为 0,循环:
- 结果 ans += (n/5);
- n /= 5;
代码如下:
class Solution {
public:
int trailingZeroes(int n) {
int ans = 0;
while(n){
ans += (n/5);
n /= 5;
}
return ans;
}
};
- 时间复杂度:O(logn)
- 空间复杂度:O(1)