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

 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 }

 

posted @ 2020-10-08 14:36  就从新的开始  阅读(1427)  评论(0)    收藏  举报