【每天一题】LeetCode 172. 阶乘后的零

本文提供了一种高效算法,用于解决LeetCode上的'Factorial Trailing Zeroes'问题,即计算n!结果尾数中零的数量。通过分析因子5的出现次数,实现了O(logn)的时间复杂度。
部署运行你感兴趣的模型镜像
机器感知
一个专注于SLAM、Linux、算法等相关技术文章分享的公众号

开源地址:点击该链接


题目描述

https://leetcode-cn.com/problems/factorial-trailing-zeroes
给定一个整数 n,返回 n! 结果尾数中零的数量。

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

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

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

解题思路

最直接的解法就是先求出 n! 等于多少
然后计算尾数中零的数量,该方法的复杂度为 O(n)
如果想实现复杂度为 O(logn)
必须另想方法,既然我们要计算尾数中的零的个数
等价于我们要计算 n! 中含有多少个 10 这个因子
再进一步的说,10 = 2 * 5,这两个因子已无法再分解了
原问题再次等价于计算 n! 中含有多少对 (2, 5) 因子
很显然,在 n! = 1*2*3*4*5*6*...*(n-1)*n 中
2 这个因子出现的次数肯定 >= 5 出现的次数
故原问题又等价于计算 n! 中因子 5 出现的次数
而所有可能出现在含有 5 的数如下:
5^1, 5^2, 5^3, 5^4, 5^5..., 5^max_exp
所以该题的解就是计算如下结果:
(n/5^1 + n/5^2 + n/5^3 + n/5^4 + n/5^5 + ... + n/5^max_exp)

示例代码

class Solution {
public:
    int trailingZeroes(int n) {
        int max_exp = log(n) / log(5);
        int res = 0;
        
        for (int i=0; i<max_exp; i++) {
            int temp = n / 5;
            res += temp;
            n = temp;
        }

        return res;
    }
};

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值