猴子分桃子
做到猴子分桃子这题,感觉很有趣,也看了其他人的一些博客,最后总结了一下,做个笔记,方便以后查看,也供大家参考,如有错误,请指出,大家共同学习进步。
题目:
海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子均分为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只猴子分到的桃子数后,要通过5n+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++;
}
}
}
来源:CSDN
作者:震逗比
链接:https://blog.csdn.net/zzlove1234567890/article/details/95774583