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

前言

想要计算阶乘后的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 阶乘后的零

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值