python学习-综合练习五(五人分鱼(优化解)、顺向、反向推导)


说明:本篇博文的知识点大部分来自 Python3 实例

五人分鱼


# A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。
# 日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。
# B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 。
# C、D、E依次醒来,也按同样的方法拿鱼。
# 问他们台伙至少捕了多少条鱼?

题干分析:
拿到这种题,如果手动计算,首先想到的是列方程,求解。但是在程序中,那我们能做的其实就是控制循环,然后不断的进行遍历,选出符合条件的数值。
比如这道题,其实有两条思路,第一条思路是顺推,按照A->E的顺序拿鱼。第二条思路就是反推,按照E->A的顺序拿鱼计算。

顺推

主要是理清思路比较麻烦,代码还是挺简单的。
控制一个循环,不断让数值fish +=1,然后循环里面一个for去判断5次,每次都是fish -1对5取余等于0。找到这个数,跳出循环,打印出来的数值就是我们需要的数值。
然后我们遍历,并不是每一个数值都要去遍历,我们只对 (total - 1) % 5 == 0 的数值去进行计算,即在循环里面,可以直接使用 idx * 5 + 1之后的fish进行计算。
·
减少了循环次数,使用传统方式,每个idx进行计算,遍历了3121次,而使用处理后的fish进行计算,只循环了624次。
·
由此可见,如果循环里面是复杂计算,这个耗时差距就会很大了。
下面看代码:


def countFish():
    idx = 0
    while True:
        fish = idx * 5 + 1
        total, enough = fish, True
        for _ in range(5):
            if (total - 1) % 5 == 0:
                total = (total - 1) // 5 * 4
                # print(total)
            else:
                enough = False
                break
        if enough:
            print(f'总共有{fish}条鱼')
            break
        idx += 1
        print(idx)


countFish()

运行结果:
在这里插入图片描述

反推

这种题还有一种反向思维,即从最后一个人能分到的最少鱼数,反向推导。
但是我写了一段代码,运行处理结果不对,我还需要调试一下。等我调试好,再把这里补充完整,如果有看到此部分,然后对反向推导有兴趣的小伙伴,可以把代码贴到评论区噢。

在此对文章内容进行补充:
参考文章为:
创新工厂面试题详解:共打了多少鱼 – 正解 递归求解法

这里有很多干货,并且针对这道题,有一句话很重要:
这道题有简单的数学解: X = 5^5 - (5-1);
这个确实很有意思,大家思考一下噢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值