经典的猴子分香蕉问题

Posted plas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典的猴子分香蕉问题相关的知识,希望对你有一定的参考价值。

public class Test7 {
public static void main(String[] args) {
/*猴子分香蕉
猴子分桃的问题,网上一搜一大把,这里我贴出我搜到的结果:
话说花果山水帘洞有5只聪明的猴子,有一天它们得到了一堆桃子,
他们发现那堆桃子不能被均匀分5份,于是猴子们决定先去睡觉,
明天再讨论如何分配。夜深人静的时候,猴子A偷偷起来,吃掉了一个桃子后,
它发现余下的桃子正好可以平均分成5份,于是它拿走了一份;接着猴子B也起来先偷吃了一个,
结果它也发现余下的桃子恰好可以被平均分成5份,于是它也拿走了一份;后面的猴子C、D、E一次如法炮制,
先偷吃一个,然后将余下的桃子平均分成5份并拿走了自己的一份,问:这一堆桃子至少有几个?
求只猴子时,这一堆桃子的个数???
*/
Scanner input = new Scanner(System.in);
int n = input.nextInt();
//定义符合的数据数变量
int sum = 0;
//定义sum自增数量的判断条件,作为while循环的判断条件
boolean flag = false;
while (!flag) {
//定义于外不为了能够扩大使用范围,作为for循环外部if语句的判断条件;
//并定义每次香蕉的剩余数量
int i, count = sum;
for (i = 0; i < n; i++) {
//每次猴子取走的一份香蕉个数
int k = (count - 1) / n;
//每次对猴子数取余都为1
if (count % n == 1) {
//拿走一份后的和吃掉一个香蕉后的剩余数量
count = count - k - 1;
}
else {
//如果取余不为1,就终止这个for循环,执行下一个数的匹配
break;
}
}

if (i == n) {
//如果能够满足上述条件,i会自增到n就终止者层while循环,此时为最小的符合数据
//并将判断条件改变,终止整个while循环
flag = true;
break;
}
else {
//每次的数据不符合时,就自增1:相当于for循环,只是不需要自定义范围
sum++;
}
}
System.out.print("山上香蕉最少有:" + sum);
}
}

 

 

 

注:while也可以利用for循环来实现,但要给出数量的范围且符合的数量有多个,需要取第一个,如下:

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
//定义符合的数据数变量
int sum = 0;
//定义sum自增数量的判断条件,作为while循环的判断条件
boolean flag = false;
while (!flag) {
//定义于外不为了能够扩大使用范围,作为for循环外部if语句的判断条件;
//并定义每次香蕉的剩余数量
int i, count = sum;
for (i = 0; i < n; i++) {
//每次猴子取走的一份香蕉个数
int k = (count - 1) / n;
//每次对猴子数取余都为1
if (count % n == 1) {
//拿走一份后的和吃掉一个香蕉后的剩余数量
count = count - k - 1;
}
else {
//如果取余不为1,就终止这个for循环,执行下一个数的匹配
break;
}
}

if (i == n) {
//如果能够满足上述条件,i会自增到n就终止者层while循环,此时为最小的符合数据
//并将判断条件改变,终止整个while循环
flag = true;
break;
}
else {
//每次的数据不符合时,就自增1:相当于for循环,只是不需要自定义范围
sum++;
}
}
System.out.print("山上香蕉最少有:" + sum);
}
}




















































































以上是关于经典的猴子分香蕉问题的主要内容,如果未能解决你的问题,请参考以下文章

LQ0120 猴子分香蕉枚举

java经典算法题——猴子吃桃

算法——猴子分桃

逻辑题——飞机加油硬币平分猴子摘香蕉

Java编程题

算法-猴子搬香蕉