阶乘后的零[挖掘规律+动态规划]

文章介绍了如何计算阶乘后零的个数,主要探讨了两种方法:一是通过动态规划寻找5的个数,二是直接计算不同5的倍数的个数。这两种方法都关注到因数5的数量,因为每个10都会贡献一个零。动态规划的方法是通过f[i]=f[i/5]+1递推得到结果,而直接寻找5的倍数则通过累加n除以5的商来获取5的质因数个数。

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

前言

想要计算阶乘后的0有多少,可以直接算出阶乘值,再不断对10取余。但是如果n比较大,这种方法是根本行不通的,只能挖掘规律。

一、阶乘后的零

在这里插入图片描述

二、挖掘规律

1、动态规划

想要得到0,等价于得到10,再等价于得到2 * 5,而5的个数一定比2多,毕竟偶数太多。

所以有了5的个数,就有了2*5的个数,就有了10的个数,自然而然就得到0的个数。
如何寻找5的个数,当i % 5 == 0时,f[i] = f[i / 5] + 1

func trailingZeroes(n int) int {
    f := make([]int,n + 1)
    rs := 0
    for i := 1;i <= n;i++ {
        if i % 5 == 0 {
            f[i] = f[i / 5] + 1
            rs += f[i]
        }
    }
    return rs
}

2、直接寻找5的个数

[1,n]中一共有m1个5的倍数,易知,m1 = floor(n / 5),还有25的倍数m2 = floor(n / 25),125的倍数m3=floor(125),这些5k除去前面包含的5k-1,还剩一个5。
所以[1,n]中有m = m1 + m2 + … + mk个5的质因数。

func trailingZeroes(n int) int {
    rs := 0
    for n > 0 {
        rs += n / 5
        n /= 5
    }
    return rs
}

总结

1)挖掘题目规律,才能转换问题,简化问题,比如求5的质因数。而后序通过动态规划来求,还是继续找规律求,又是另一回事了。

参考资料

[1] LeetCode 阶乘后的零

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值