通俗易懂、简单粗暴地解决各类猴子分桃问题

起因

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子分为五份,多了一个,这只猴子把多的一个仍入海中,拿走了一份。第二只猴子把剩下的桃子平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、四、五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

起初我看到这道题是崩溃的,咋又碰到数学题啦!我数学向来差的一批,所以这道题我是真真的没想出啥解决的方法,于是乎我便到网上查找解题方案,好家伙,不查不要紧,一查我更崩溃了,因为我发现那些解释我一个都没懂!尽管N多个人从N多个方向提出了解题思路,但我是真弄没弄清楚他们列出来的数学公式。连解题思路我都没懂,就更别谈网上的代码了,代码复制下来是能跑出正确结果,但是从开头的数值初始化,到最后的打印语句,我没有一行能理解的o(╥﹏╥)o

就在我万念俱灰、瞎搞乱搞之际,突然一条思路在我脑袋里冒出,顺着这条思路我瞬间理清了解决方法,并相当轻松的完成了代码!!这个思路不需要你有啥数学知识,也不用列什么数学公式,只有非常简单的一点逻辑分析,我相信在这个思路下,大家就算数学糊烂到爆,也能理解这道题,毕竟数学再烂能有我烂!?

问题分析

分析这个猴子偷桃的问题之前,可以参考一下我之前写的这篇,暴力解三元一次方程的思路:用for循环解三元一次方程的思路

拥有好的数学功底,固然能更好的写出程序,但是程序不仅仅只有数学,还有逻辑分析。数学解不出来,我就用程序暴力解决呗,程序不就是代替我们人类做起来重复又繁琐的事嘛。回到猴子分桃的问题上来, 目前咱们从题目中得到的信息说多不多,说少不少,咱们一步一步得来提取:

首先,有一个固定的数值是显然易见的,那么就是猴子有5只,他们一共分了5次桃。那咱们就将猴子的变量先提取出来,monkey = 5呗。

然后,每次分桃时候的桃子数量有5份+1,至于每份是多少,不知道。最难的地方就在这,每份的桃子数不光不确定,而且每次分完桃子后,桃子的数量还会变化!!不过别急着用数学的公式来解决他,这里虽然是最难搞定的,但也是突破口。

咱继续进一步思考,猴子每次会分5份桃子+1个,然后丢掉一个,拿走一其中份,这不就代表着 将 桃子数先 - 1,然后再拿走五分之一数量的桃子,只剩下五分之四的桃子,并且下一次分桃又重复着这种操作,总共进行了5次。 (不要嫌我啰嗦反复讲这些已知的,代码马上就可以写出了)。同样的操作,进行了5次,嗯哼,大家有联想到程序里的什么吗!? 没错,这不就是循环嘛!! 一共循环了5次呗。OK,咱们现在知道要弄一个循环出来了,循环的执行代码块又是啥咧?

int i = 1;// 循环的条件变量
while(i <= 5) {
   
	//这里要做点啥咧......
	i++;
}

有一个数,要 - 1后 再 剩下 五分之四,并且要不断的进行五次,也就是说,咱们要求的这个数要达到这些条件才符合我们的要求。符合要求,嗯哼?大家又联想到程序里的什么吗?是滴,就是判断嘛,一个数要符合这个条件并持续五次,才算达到要求。OK,那不就代表咱们要把判断条件放到那个五次循环里进行嘛,循环执行完毕后都通过了判断,就代表找到那个数了!

咱们要最终找到的那个数是桃子,所以变量为了见名知意,就定为peach哈

int i = 1;
while(i <= 5) {
   
	// -1后才能分平均五份,不就代表着模5要等于1嘛
	if (peach % 5 == 1) {
   
		// 每次弄完后,就剩下原数量的 - 1后的五分之四了,所以每次要将这个数更新一下
		// peach / 5就代表现在的每份桃子的数量
		// 拿掉一份后,就是只剩下四份,所以才乘以4
		// 有人问不是多了一个桃子嘛,怎么不用-1呢,因为程序/5会直接减掉余数,所以不用-1后再除。
		// 如果想-1后再除以5,也是一样的,只是没必要
		peach 
  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值