海滩上有一堆桃子,五只猴子来分。 第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走

海滩上有一堆桃子,五只猴子来分。 第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份, 第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?

代码:

public class peach {
	public static void main(String[] ars) {
		/**
		 *  猴子分桃子 , 树林里有一堆桃子 , 
		 *  第一个猴子过来之后 扔到一个桃子 , 然后把桃子平均分成5份 , 自己拿走一份
			第二个猴子过来 扔到一个桃子  , 把桃子平均分成5份  , 自己拿走一个份
			第三个 第四个 第五个猴子都这么做 ...
			请问 树林里的桃子最少要有多少个  ?
			
			3121
			3121-1 / 5 * 4 = 2496
			2496 -1 /5 *4 = 1996
			1996 -1 / 5 *4 = 1596
			1596 -1 / 5*4 = 1276
			1276 - 1/ 5*4 = 1020
		*/
//		方法1
		for (int i = 1;; i++) {
			int sum = i;
			if ((sum - 1) % 5 == 0) { //保证第一次分
				sum = (sum - 1) / 5 * 4;
				if ((sum - 1) % 5 == 0) { //保证第二次分
					sum = (sum - 1) / 5 * 4;
					if ((sum - 1) % 5 == 0) { //保证第三次分
						sum = (sum - 1) / 5 * 4;
						if ((sum - 1) % 5 == 0) { //保证第四次分
							sum = (sum - 1) / 5 * 4;
							if ((sum - 1) % 5 == 0) {  //保证第五次分
								System.out.println(i);
								break;
							}
						}
					}

				}

			}
		}
		
		
		//方法二:
		// 升级版
		for (int i = 1;; i++) {
			int sum = i; 
			for (int j = 0; j < 5; j++) {
				if( sum % 5 != 1){
					break;
				}
				sum = (sum-1) / 5 * 4;
				if( j == 4){
					System.out.println(i);
					return ;
				}
			}
		}
	}

}

方法三:

/**
 * @author Amanda
 *题目:海滩上有一堆桃子,五只猴子来分。 
	第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
	第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份, 
	第三、第四、第五只猴子都是这样做的,
	问海滩上原来最少有多少个桃子?
 */
public class PeachRecursion {
	public static void main(String[] args){
		System.out.println(show(4,5,5,4));
	}
	
	//方法三:递归调用+三目
	public static int show(int i,int monkeyCount,int monkey,int sum){
		return monkeyCount == 0 ? sum : sum % 4 == 0 ?
				show(i,monkeyCount - 1,monkey,sum / 4 * 5 + 1):
					show(i + 1,monkey,monkey, i + 1);
	}
}

你可能感兴趣的:(JavaSE)