第一隻猴子把這堆桃子平分爲五份,多了一個,這隻猴子把多的一個扔入海中,拿走了一份。
第二隻猴子把剩下的桃子又平分成五份,又多了一個,它同樣把多的一個扔入海中,拿走了一份,
第三、第四、第五隻猴子都是這樣做的,
問:
海灘上原來最少有多少個桃子
第一隻猴子把這堆桃子平分爲N份,多了K個,這隻猴子把多的一個扔入海中,拿走了一份。
第二隻猴子把剩下的桃子又平分成N份,又多了K個,它同樣把多的K個扔入海中,拿走了一份,
一直到最後一隻猴子也是這麼做
問:
海灘上原來最少有多少個桃子
*/
//傳統猴子分桃
public static int get(int times ,int sum ,int lastSum){
//0則返回
if (times == 0) {
return sum;
}else if (times == 5) {
//重新開始計算判斷是否要重置數據
if ((sum-1)%5==0&&sum>=6) {
return get(times-1, sum, (sum-1)/5*4);
}else {
return get(5, 6, 0);
}
}else {
//計算是否滿足這一次分桃
if ((lastSum-1)%5==0&&lastSum>6) {
return get(times-1, sum, (lastSum-1)/5*4);
}else return get(5,sum+5,0);
}
}
//自定義猴子分桃包括猴子數量以及每一次遺留下相同的桃子數量
public static int get(int monkeys,int loseSimpleNum){
int minNum = monkeys+loseSimpleNum;
return getDiy(monkeys, minNum, 0, loseSimpleNum, monkeys);
}
public static int getDiy(int times ,int sum ,int lastNum,int loseSimpleNum,int monkeys) {
int minNum = monkeys+loseSimpleNum;
int nextmonkeys = monkeys-1;
/* System.out.println(times+"sum:"+sum+"\nlastNum:"+lastNum);*/
//0則返回
if (times == 0) {
return sum;
}else if (times == monkeys) {
//重新開始計算判斷是否要重置數據
if ((sum-loseSimpleNum)%monkeys==0&&sum>=minNum) {
//System.out.println("replare");
return getDiy(times-1, sum, (sum-loseSimpleNum)/monkeys*nextmonkeys,loseSimpleNum,monkeys);
}else {
//System.out.println("replare222");
return getDiy(times, minNum, 0,loseSimpleNum,monkeys);
}
}else {
//計算是否滿足這一次分桃
if ((lastNum-loseSimpleNum)%monkeys==0&&lastNum>minNum) {
//System.out.println("nest");
return getDiy(times-1, sum, (lastNum-loseSimpleNum)/monkeys*nextmonkeys,loseSimpleNum,monkeys);
}else return getDiy(monkeys, sum+monkeys, 0,loseSimpleNum,monkeys);
}
}
}