leetcode_172. 阶乘后的零

给定一个整数 n,返回 n! 结果尾数中零的数量。

示例 1:

输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。

示例 2:

输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.

说明: 你算法的时间复杂度应为 O(log n) 。

解析:本题肯定不能把阶乘算出来然后数,凭借阶乘的爆炸式增长,很快便会发生溢出。
我们以5为例进行分析
5! = 5 * 4 * 3 * 2 * 1 = 120
阶乘尾数的零,来自其中的每一个10
而每一个10,仅可能来自2 * 5
而阶乘中偶数的数量占了一半,而2的数量更多,必然多于5的数量
因此我们可以仅仅考虑阶乘中的5。
列举一个更大的阶乘
10! = 10(2 * 5) * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 3628800
对其中的每一个数字进行分解,不难发现其中总共有两个5
而尾数也有两个0.
因此判断尾数有几个零,只要判断这个阶乘分解出来的乘法因子总共有多少个5即可。

仍然以10为例子,我们直接将这个数除以5
10 / 5 = 2
恰好即为尾数后面零的个数
这里除5的意义是得到10的阶乘中,有2个数字可以被5整除,即可以分解出乘法因子5

但是如果扩展到25的阶乘
25 / 5 = 5
但其实25的阶乘末尾有6个零
这是因为25除5得到5,仅仅说明25的阶乘中,有5个数字可以被5整除,但25本身可以分解成5*5,所以完全分解之后的乘法因子中总共有6个5。
因此我们需要循环相除。
25/5得到的5,这个5可以翻译成{1,2,3,4,5}这样的集合,即所有5的倍数除以5后剩下的余数,我们需要继续判断其中是否存在5的倍数
我们继续对其除以5
5 / 5 = 1
将这些结果相加即可得到乘法因子5的总数量,即阶乘尾数0的数量。

本题代码十分简单,但是怎样理解是重点难点所在

class Solution {
public:
    int trailingZeroes(int n) {
        int res = 0;
        while(n){
            res += n / 5;
            n /= 5;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值