public class Monkeys { public static boolean eatAndHide(int x, int times) { if (times==0) return true; if ((x-1)%5!=0 || x<=0) return false; return eatAndHide((x-1)/5*4, times-1); } public static void main(String[] args) { int x = 1; while(!eatAndHide(x,6)||x%5==0) //添加x%5==0强制第二天也不能被平分 x++; System.out.println("最少有桃子" + x + "个 "); } }
第四只猴子吃掉一个桃子后剩5(5a+1)/4=25a/4+5/4
第三只猴子吃掉一个桃子后剩5(25a/4+5/4+1)/4=125a/16+45/16
第二只猴子吃掉一个桃子后剩5(125a/16+45/16+1)/4=625a/64+305/64
第一只猴子吃掉一个桃子后剩5(625a/64+305/64+1)/4=3125a/256+1845/256
原来共有桃子3125a/256+1845/256+1=3125a/256+2101/256=(12a+8)+53(a+1)/256
桃子数是整数 所以a=255 桃子总数3121个第一只猴子吃掉一个剩3120 拿走624 剩2496
第二只猴子吃掉一个剩2495 拿走499 剩1996
第三只猴子吃掉一个剩1995 拿走399 剩1596
第四只猴子吃掉一个剩1595 拿走319 剩1276
第五只猴子吃掉一个剩1275 拿走255 剩1020当a取255+256n(n为自然数)时 对应无数组解 上面的是最小正整数解
最后剩1020,第二天猴子们明显就会发现桃子被偷了,因为最后能平分了
for (int i = 0;; i++) {
int x = 5 * (i + 1) + 1;
int y = x;
for (int j = 0; j < 5; j++) {
y = y * 5 / 4 + 1;
if ((y - 1) % 5 != 0) {
break;
}
}
if ((y - 1) % 5 == 0) {
System.out.println("最少有桃子" + y + "个 ,最后剩下" + x + "个");
return;
}
}
}最少有桃子15621个 ,最后剩下5116个
public static boolean eatAndHide(int x, int times) {
if (times==0) return true;
if ((x-1)%5!=0 || x<=0) return false;
return eatAndHide((x-1)/5*4, times-1);
} public static void main(String[] args) {
int x = 1;
while(!eatAndHide(x,5))
x++;
System.out.println("最少有桃子" + x + "个 ");
}
}
运行结果:最少有桃子3121个
你这段代码唯一不对的地方在这里
for (int j = 0; j < 5; j++)改成for (int j = 0; j < 4; j++)
原因是
int x = 5 * (i + 1) + 1;
这已经相当于最后一只猴子偷吃过了,所以for只要循环4次就够了
小学奥数上有一题是猪八戒吃饺子,题目明确说了最后能平分,用alexandertech的解法没错,但猴子这个还真没看哪个版本说最后桃子能不能平分的。
public class Monkeys {
public static boolean eatAndHide(int x, int times) {
if (times==0) return true;
if ((x-1)%5!=0 || x<=0) return false;
return eatAndHide((x-1)/5*4, times-1);
} public static void main(String[] args) {
int x = 1;
while(!eatAndHide(x,6)||x%5==0) //添加x%5==0强制第二天也不能被平分
x++;
System.out.println("最少有桃子" + x + "个 ");
}
}
public static boolean eatAndHide(int x, int times) {
if (times==0) return x%5!=0; //添加x%5!=0强制第二天也不能被平分
if ((x-1)%5!=0 || x<=0) return false;
return eatAndHide((x-1)/5*4, times-1);
} public static void main(String[] args) {
int x = 1;
while(!eatAndHide(x,6))
x++;
System.out.println("最少有桃子" + x + "个 ");
}
}