基础练习简单递归 【2】

阶乘后的零

  • 算法题目

172. 阶乘后的零 - 力扣(LeetCode)

  • 题目简介

在这里插入图片描述

  • 算法分析

计算尾随0的个数,要想结果等于0,至少是2*5这种,再往上就分别是2和5的倍数可以达到这样的效果。本题化简一下:求的是含有2和5这两个因子的个数,一对2 * 5可以得到一个0。

举例:8! 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1

2、4、6、8都含有因子2

只有5含有因子5,所以最后得到的结果只有一个尾随0

再者可以发现,5的因子占少数,所以本题最终求的是含有5的因子的个数

5、10、15、20、25、30……都含有因子5

这里面需要注意的是有些数含有两个因子5,如25,甚至3个因子5,如125……

含有1个因子5:5、10、15、20、25、30…… n/5(每隔五个数来一次)

含有2个因子5:25、50、75、100、125…… n/25

含有3个因子5: 125、250、375…… n/125

25、50后面这些多因子的在前面含有一个个因子的时候就被算进去了一次

125、250在前面被算进去两次了

所以大概的近似为n/5 + n/25 + n/125 ……

递归:f(n) = n/5 + f(n/5)

  • 源码分析

方法一:递归

再加一个最后递归结束的条件n<5即可

int trailingZeroes(int n) {
    if(n<5)
        return 0;
    return n/5 + trailingZeroes(n/5);
}

这里面有 ‘ / '的特性,如果n=6,只含有一个因子5,尾速0为1,且正好6/5为1

方法二:循环

int trailingZeroes(int n) {
    int i;
    int res = 0;
    //每次只加5,碰到含有多个因子5的需要进一步统计
    for(i=5;i<=n;i+=5)
    {
        int j;
        for(j = i;j % 5==0;j/=5)
        {
            res++;
        }
    }
    return res;
 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值