1 public Class Test{
2 /**
3 * 恒生2020春招开发笔试题(算法):
4 * 海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,
5 * 这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,
6 * 它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,
7 * 问海滩上原来最少有多少个桃子?
8 * 思路:一种思路是假设桃子个数为n个,那么剩余桃子个数式子为:n - n/5 - n%5,最后只需找到第一个符合n%5==1的数
9 * 另一种思路是假设第五个猴子的个数为n,那么原先的桃子个数式子为:5 * n + 1,
10 * 那么原来最少的桃子的个数取决于第五个猴子拿到的那份桃子个数,如果第五个猴子拿到的那份桃子最少,就符合了,
11 * 那么第五个猴子拿到的那份桃子最少就是1了,当 n = 1 时,沙滩的原先的桃子最少。
12 * 第二种思路是最佳,逆向思维
13 * @params: []
14 * @return: int 返回海滩上原来有的最少桃子数
15 */
16 public static int dividePeaches(int monkey,int divide,int remainder){
17 //将桃子往回放
18 return increase(1,divide,remainder,monkey);
19 }
20 /**
21 *
22 * 将数按照规格递增,然后加上余数,递归递增
23 * @params: [num, divide, remainder, count] num:数, divide:规格, remainder:余数, count:递增次数
24 * @return: int
25 */
26 public static int increase(int num,int divide,int remainder,int count){
27 int temp = divide * num + remainder;
28 if (count <= 2 ) return temp;
29 count--;
30 // System.out.println(temp);//每次递增的结果
31 return increase(temp,divide,remainder,count);
32 }
33 public static void main(String[] args){
34 // System.out.println(increase(1,5,1,5));
35 System.out.println(dividePeaches(5, 5, 1));
36 }
37 }