Java基礎語法題(41):海灘上有一堆桃子,5只猴子來分

題目描述:

海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子憑據分為五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的,問海灘上原來最少有多少個桃子?



<code>    package Demo41Allot_Peach;
/**
* 海灘上有一堆桃子,五隻猴子來分。第一隻猴子把這堆桃子憑據分為五份,
* 多了一個,這隻猴子把多的一個扔入海中,拿走了一份。第二隻猴子把剩下的桃子又平均分成五份,又多了一個,
* 它同樣把多的一個扔入海中,拿走了一份,第三、第四、第五隻猴子都是這樣做的,問海灘上原來最少有多少個桃子?
*/
/*
分析:猴子分桃問題,按題目的意思來說,這一堆桃子的總數除以五會餘一,它的商除以五也會餘一,但是難點是我們不知道最後一隻猴子拿了幾個桃子。
所以呢,就要先定義規則,然後從1開始遍歷數字,符合規則的就是最少有的桃子數。
假設有x個桃子,第一隻猴子分完後,就是x/5=1,第二隻猴子分的時候就是x/5個桃子了。
判斷x%5是否等於1,如果不等於1,則直接不符合,繼續遍歷,如果等於1,則繼續比較,最後一個猴子至少要拿到一個桃子,且扔掉一個桃子
*/

public class Allot_Peach {
public static void main(String[] args) {
// 關於index,可以從1開始,但是我們知道桃子數一定是要大於5的,所以從6開始
int index = 6;
// 一直找,一直找
while (true) {
// 對於每一個index都調用finds()方法來判斷其是否符合條件
boolean finds = finds(index);
// 如果符合條件,則輸出結果,並且終止循環
if (finds) {
System.out.println("海灘上最少有" + index + "個桃子。"); //最少3121只桃子
break;
}
// 6除以5餘1,那麼步進就得是5,因為1~4得到的餘數分別為2,3,4,0,當然,步進為1也是ok,就是效率低了些。
index += 5;
}
}
/**
* 定義一個判斷數字是否符合條件,符合就返回一個true,否則返回false
* 所謂條件就是該數每次計算之間,num值一定要大於5,不然怎麼分五份呢是不?
* @param num
* @return
*/
public static boolean finds(int num) {
// 定義要返回的布爾值
boolean flag = false;
// 有5只猴子,判斷5次
for (int i = 1; i <= 5; i++) {
// 判斷num是否大於5,要是還沒到第五隻猴子呢就不足五個桃子了,那第五隻猴子要生氣了,並且判斷該數是否除5餘1

if (num > 5 && num % 5 == 1) {
// 判斷是不是最後一隻猴子,如果到最後一直猴子了,且符合條件,就返回true,表明找到了該數。
if (i == 5) {
flag = true;
} else {
// 如果不是最後一隻猴子,那麼該猴子丟掉一個,且拿走五分之一,剩下原來桃子數-1的4/5
num = ((num-1)*4) / 5;
}
} else {
// 如果該數小於5導致沒法分了,或者不符合最後能丟掉一個的條件,直接返回false
return false;
}
}
return flag;
}
}/<code>


分享到:


相關文章: