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/divclass 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% 的用户
