1. 程式人生 > >經典的猴子分香蕉問題

經典的猴子分香蕉問題

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