给定一个整数 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
进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/factorial-trailing-zeroes
(1)思路1
① 两个数相乘结果末尾有 0,这说明这两个数中有因子 2 和 5,即问题可以转化为:n! 最多可以分解出多少对因子 2 和 5?;
② 再进一步分析,由于每个偶数都能分解出因子 2,因子 2 肯定比因子 5 多,所以分解的因子对数主要取决于能分解出几个因子 5;
③ 最后就问题转化为:n! 最多可以分解出多少个因子5? 求解的难点在于对于50,75这样的数,它们可以分解出多个因子 5,因此关键在于不能漏算。因此我们可以依次计算小于等于 n 的整数中可以分解出1、2、3…i 个5的整数个数,当 5i>n 结束计算,最后将其相加即可。
//思路1
public int trailingZeroes(int n) {
int res = 0;
//factor=5^i^,初始时i=1
int factor = 5;
while(factor<=n){
res+=n/factor;
//此处可以看作i++
factor*=5;
}
return res;
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43004044/article/details/122376015
内容来源于网络,如有侵权,请联系作者删除!