力扣 172. 阶乘后的零

本文解析如何通过统计[1,n]中5的因子个数来确定阶乘中尾部0的个数,关键在于递归地减小n并累计因子5的贡献。算法核心在于不断除以5直到n不足5。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:https://leetcode-cn.com/problems/factorial-trailing-zeroes/

大致题意:
给一个整数 n,求出 n 的阶乘中尾部 0 的个数

思路

尾部的 0,即为阶层乘积中因子 10 的个数,而 10 = 2 * 5,于是 0 的个数即为阶乘乘积因子中 2 和 5 之间的最小值

而 5 因子个数一定小于 2 因子的个数,所以这道题可以变成求 5 因子的个数

于是可以通过求 [1,n] 中因子 5 的个数得到答案

  • [1,n] 中因子 5 的倍数有 n / 5 个,这些数贡献了 n / 5 个因子 5
  • [1,n] 中因子 52 的倍数有 n / 52 个,这些数相比较之前额外贡献了 n / 52 个因子 5
  • [1,n] 中因子 5i 的倍数有 n / 5i 个,这些数相比较之前额外贡献了 n / 5i 个因子 5

这样递归下去,直至 5i 大于 n,过程中即可统计出[1,n] 中因子 5 的个数

具体实现时,可以每次统计后将 n 的值除以 5,而不用更改除数的值

public int trailingZeroes(int n) {
        int ans = 0;
        while (n >= 5) {
            n /= 5;
            ans += n;
        }
        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值