LeetCode_数学_阶乘_中等_172.阶乘后的零

x33g5p2x  于2022-01-09 转载在 其他  
字(0.7k)|赞(0)|评价(0)|浏览(261)

1.题目

给定一个整数 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

2.思路

(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 结束计算,最后将其相加即可

3.代码实现(Java)

//思路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;
}

相关文章