172.阶乘后的零

本文介绍了一种高效的算法,用于计算给定整数n的阶乘尾数中零的数量,利用观察到的因子5规律,将时间复杂度降低到O(logn)。通过整除5的倍数来估算5的因子数量,适用于编程实现如C++的Solution类中的trailingZeroes方法。
摘要由CSDN通过智能技术生成

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

示例 1:
输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。
示例 2:
输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.

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

这题如果直接结算阶乘,那么时间复杂度肯定不是logn级别。
我们分析一下,要产生0,最小的必须是25=10会产生0,也就是说要关注阶乘中的数有多少2和5的因子,2的因子只要是偶数就行,那么关键在于因子5的数有几个。我么知道,每隔5个数就会有一个数存在5的因子。那么只要整除5就行,但是要注意:
25=5
5,有两个5因子,而125有3个5因子。所以类推。
我们可以先设第一个区间为5,结果加上整除5,然后区间*5,变成25,结果加上整除25,一直到区间比这个数还大。这样就达到了log5n级别的复杂度。

class Solution {
public:
    int trailingZeroes(int n) {
         int res = 0;
    long divisor = 5;
    while (divisor <= n) {
        res += n / divisor;
        divisor *= 5;
    }
    return res;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值