經典的猴子分香蕉問題


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);
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM