五猴分桃问题python代码_C语言经典案例|猴子分桃

猴子分桃问题

有一堆桃子和甲、乙两组猴子,甲组有 3 只猴子,乙组有 5 只猴子。甲组的猴子先看到 这堆桃子。第一只猴子把桃分成了相等的 3 堆,多出 2 个。于是,它吃掉了 2 个,又拿走了 1 堆;第二只猴子把 2 堆桃子合在一起,又分成相等的 3 堆,又多出 2 个。于是,它也吃掉 了 2 个,拿走了 1 堆;第三只猴子也照样办理。甲组猴子走后,乙组猴子也看到剩下的 2 堆 桃子,第一只猴子把桃分成了相等的 5 堆,多出 1 个。于是,它吃掉了 1 个,又拿走了 1 堆; 第二只猴子把 4 堆桃子合在一起,又分成相等的 5 堆,又多出 1 个。于是,它也吃掉了 1 个,拿走了 1 堆;第三、四、五只猴子也照样办理。请设计算法,求:8 只猴子走后至少还 剩下多少个桃子?原来这堆桃至少有多少个?

我的想法

这道题是课上数据结构的一道题,经度娘搜索后找到了解法然而是用pascal语言写的(http://www.doc88.com/p-6502904388261.html),也就没有细看直接上手了。

不同于一般的倒推法,这里甲组和乙组分别代表两个循环,所以我们需要特别注意如何处理这两个循环的关系。

如果我们将桃子的数量用数组a[9]存放,a[0]表示8只猴子分完后剩下的桃子数量,a[8]表示未分桃子时的桃子总数。

可以发现乙组猴子每分一次桃子执行的操作是

a[i−1]=(a[i]−1)/5∗4a[i−1]=(a[i]−1)/5∗4

倒推表示即为

a[i]=a[i−1]/4∗5+1a[i]=a[i−1]/4∗5+1

在循环中实现时判断条件是a[i]%4==0,这一点可以从a[i-1]=(a[i]-1)/5*4中看出,其现实含义是每只乙组猴子所面对的桃子数量都是由前一只猴子分剩下的四堆桃子拼成的。

然而唯一的例外是乙组的第一只猴子,他所面对的桃子数量应该符合甲组分桃的规则即a[5]%2==0,是由甲组最后一只猴子分剩下的两堆拼成的。

同理甲组猴子分桃操作满足规则

a[i]=a[i−1]/2∗3+2a[i]=a[i−1]/2∗3+2

与乙组相同,甲组第一只猴子所面对的桃子数量(即桃子总数)不需要满足甲组规则,由于在他之前没有任何分桃操作也就无需满足所谓的分桃规则,直接得出答案。

在处理完循环内的数量关系后,我们来斟酌一下两个循环的关系。显而易见,寻找答案时循环绝不只执行一次,我们需要添加一些标识符来选择循环和循环开始的位置,具体见注释。

代码

40826df48636f4b44acfc58a1dcbd380.png
774b9d62ca72d1277e343496a55b440f.png
9a631db562e50c9912f7bf311fd3b93e.png

原文来自网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值