猴子分桃子问题

牧云@^-^@ 提交于 2019-12-07 19:21:47

猴子分桃子

做到猴子分桃子这题,感觉很有趣,也看了其他人的一些博客,最后总结了一下,做个笔记,方便以后查看,也供大家参考,如有错误,请指出,大家共同学习进步。

题目:

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子均分为5份,多了一个,然后这只猴子把多的一个桃子扔到了海中,拿走了一份。第二只猴子把剩下的桃子均分成五份,发现也多了一个,然后也将多的一个扔到了海里,拿走了一份。第三只、第四只、第五只猴子都是这样做的,问海滩上原来至少有多少个桃子?

思路:

我们可以假设最后一只猴子拿到的那份桃子的数量为n,则:

  • 第五只猴子分到的桃子数:n
  • 第四只猴子分到的桃子数:(5*n + 1)/4
  • 第三只猴子分到的桃子数:(((5*n +1)/4)*5+1)/4
  • 第二只猴子分到的桃子数:(((((5*n+1)/4)*5+1)/4)*5+1)/4
  • 第一只猴子分到的桃子数:((((((5*n+1)/4)*5+1)/4)5+1)/45+1)/4
  • 开始时沙滩上桃子的总数:(((((((5*n+1)/4)*5+1)/4)*5+1)/4)*5+1)/4)*5+1

我们可以先假定第五只猴子分到的桃子数为1,然后依次往上推第四只猴子分到的桃子数,然后再由第四只猴子分到的桃子数逆推第三只猴子分到的桃子数,依次逆推第二只、第一只,最终得到第一只猴子分到的桃子数,最后再由第一只猴子分到的桃子数,求得开始沙滩上桃子的总数。
在逆推的过程中,每一次求得第i只猴子分到的桃子数后,要通过5×\timesn+1 求得第i只猴子分桃子之前沙滩上存在的桃子数量,同时需要判断该数是否能够被4整除,因为沙滩上存在的桃子数,是上一只猴子分过桃子之后剩余的四份,所以一定能够被4整除。
当上述判断条件不满足时,就将第五只猴子分到的桃子数加1,再重新进行运算。

代码

第一种是返回的最终结果是第一只猴子分到的桃子数,然后在输出时再乘以5加上1,获得最终结果。

public static void main(String[] args){
		int endPeach = 1;                         // 设定第五只猴子分到的桃子数为1
		int middlePeach = 0;
		int count = 1;                           // 用于累加器计数
		int allPeach  = 0;                        // 每只猴子在分桃子之前,沙滩上存在的桃子总数
        while(count < 5){
        		middlePeach = endPeach;
        		for(int i = 0; i < 4; i++){
        				allPeach = middlePeach * 5 + 1;
        				if(allPeach % 4 != 0){     // 判断猴子分桃子前沙滩上的桃子总数能否被4整除
        					endPeach++;
        					count = 1;
        					break;
        				}
        				middlePeach = allPeach / 4;
        				count++;
        		}
        }
        System.out.println("沙滩上至少有 " + (middlePeach * 5 +1) + " 个桃子。")
}

第二种是直接最终结果返回的就是沙滩上桃子总数

public static void main(String[] args){
		int endPeach = 1;                         // 设定第五只猴子分到的桃子数为1
		int middlePeach = 0;
		int count = 1;                           // 用于累加器计数
		int allPeach  = 0;                        // 每只猴子在分桃子之前,沙滩上存在的桃子总数
        while(count < 5){
        		middlePeach = endPeach;
        		for(int i = 0; i < 5; i++){
        				allPeach = middlePeach * 5 + 1;
						if(i == 4){
								System.out.println("沙滩上至少有 " + allPeach + " 个桃子。");
								break;             // 加上break,将返回第一个满足条件的桃子总数;不加则返回4个满足条件的桃子总数。
								                   // 至于为什么没有返回很多个结果,没仔细想,如有知道的大佬,可以告诉我一下。
						}
						
        				if(allPeach % 4 != 0){     // 判断猴子分桃子前沙滩上的桃子总数能否被4整除
        					endPeach++;
        					count = 1;
        					break;
        				}
        				middlePeach = allPeach / 4;
        				count++;
        		}
        }   
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!