日期:2014-05-20  浏览次数:20777 次

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

------解决方案--------------------
100以内的话,没有合适的值。
最小值是3121。
下面是代码和执行结果。

import java.util.ArrayList;

public class Test {
public static void main(String[] args) {
int now = 0;
int loop = 5;
ArrayList<Integer> counts = new ArrayList<Integer>();
for (int i = 1; i <= 50000; i++) {
now = i;
for (int j = loop; j > 0; j--) {
if (now % loop == 1) {
now = (now - 1) * (loop - 1) / loop;
if (j == 1) {
counts.add(i);
}
}
}
}
System.out.println("个数:" + counts.size());
for (Integer integer : counts) {
System.out.println(integer);
}
}
}

执行结果

个数:16
3121
6246
9371
12496
15621
18746
21871
24996
28121
31246
34371
37496
40621
43746
46871
49996
------解决方案--------------------
探讨
我感觉这个题是没有答案的,首先,5只猴子分5次,而且每次都是分为5份并且多一个,假设总的桃子为x的话,那么这个x与5相余剩1,那么第一个猴子来分的时候,分为5分扔掉了一个并拿走一份,那么剩下的桃子数就一定是0或者5结尾的数,那么第二只猴子来做相同的操作的时候就不可能实现了,本人愚见,多指教。

------解决方案--------------------
package com.jms.mq;

public class Test{
public static void main(String[] args) {
Test t= new Test();
int j;
for(int i=0;i<1000;i++){
//后面的猴子拿到的桃子必须乘以5,加1,后被4整除
j =((i*5)+1)%4;
//只有j=0的时候才为合法值
if(j==0){
Integer m=i;
//递归4次获取第一只猴子获取的桃子个数
for(int a=0;a<4;a++){
m=t.getSum(m);
if(m==null){
break;
}
}
if(m!=null){
System.out.println("第5只猴子分到的个数"+i);
System.out.println(m*5+1);
System.out.println("-------------");
}
}
}
}

/**
* 获取前面猴子得到的桃子的个数
* @return
*/
public static Integer getSum(int i){
//判断是否合法
if(((i*5)+1)%4==0){
return (i*5+1)/4;
}else{
return null;
}
}
}
第5只猴子分到的个数255
3121
-------------
第5只猴子分到的个数511
6246
-------------
第5只猴子分到的个数767
9371
-------------
所以满足要求需要的最少的桃子是3121个