leetcode:172. 阶乘后的零
题目
给定一个整数 n
,返回 n!
结果中尾随零的数量。
提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?
示例:
输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0
输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0
输入:n = 0
输出:0
解答 & 代码
- 原题目:求
n!
结果中尾随零的数量
- 两个数相乘结果末尾有 0,一定是因为两个数中有因子 2 和 5,2 * 5 = 10
- 可转换为:求
**n!**
最多可以分解出多少个因子 2 和 5?
- 每个偶数都可以分解出因子 2,因此因子 2 的数量肯定比因子 5 多
可转换为:求
**n!**
最多可以分解出多少个因子 5?- 每个
div=5
的倍数都至少可以提供一个因子 5,n!
中有n/5
个 5 的倍数 - 每个
div=25
的倍数还可以再提供一个因子 5,n!
中有n/25
个 25 的倍数 - 每个
div=125
的倍数还可以再提供一个因子 5,n!
中有n/125
个 125 的倍数 - …
因此,依次遍历
div = 5, 25, 125...,
直到div > n
停止遍历。对于每个 div,n!
中有n/div
个div
的倍数,尾随零的个数就+n/div
class Solution {
public:
int trailingZeroes(int n) {
if(n <= 0)
return 0;
int result = 0;
int div = 5;
while(div <= n)
{
result += n / div;
div *= 5;
}
return result;
}
};
复杂度分析:整数 n
- 每个
- 时间复杂度
:
- 空间复杂度 O(1):
执行结果:
执行结果:通过
执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户
内存消耗:5.7 MB, 在所有 C++ 提交中击败了 87.85% 的用户