原帖地址在http://www.iteye.com/topic/679770,其中的猴子偷桃问题的的解法, 楼主用的是递归,有另外一位朋友提出了一个更简单的方法,由于自己也有点爱数学,所以提出了另外一种解法,当然是用的数学的方式。效率确实比原帖中的两位朋友的效率都高一些些。
看原帖:
楼主的作品: 思路清晰,很好理解。
package com.sailor.game;
/**
* 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩
* 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
* 程序分析:采取逆向思维的方法,从后往前推断。
*
* @author Sailor
*
*/
public class Monkey_Peach {
public static void main(String[] args) {
int[] peach = new int[10];
peach[9] = 1;
// 下面利用的是数组和循环将每天的桃子数量都求出来了
for (int i = peach.length - 1; i > 0; i--) {
peach[i - 1] = 2 * (peach[i] + 1);
}
for (int i = 0; i < peach.length; i++) {
System.out.println(peach[i]);
}
System.out.println("第一天的桃子数:"+getPeach_Num(10, 1));
}
// 利用递归的方法来求第一天的桃子数,输入参数为天数和当天的桃子数,输出为第一天桃子数
public static int getPeach_Num(int day, int peach_num) {
if (day == 1)
return peach_num;
else if (day < 1 || peach_num < 0)
return 0;
else
return getPeach_Num(day - 1, (peach_num + 1) * 2);
}
}
一位朋友的回答,把复杂问题简单化了,也很好理解
因为到第10天只有一个桃子了,我们就可以这么理解了,假设今天还有x个桃子,那么他前一天的应该是(x+1)*2,那么直接使用
int x = 1;
for(int i=9;i>0;i--){
x = (x+1) * 2;
}
System.out.println(x);
就可以计算到你的结果。
然后是我自己的解法:
public static long getPeach_Num3(int day){
return 3*(1<
}
说下我的解题思路:(注意: 楼主和那位朋友的解法都是从第2天发现桃子还剩1个开始计算的, 所以就不考虑第一天吃后就发现只剩1个的情况了。)
于是就有了程序里面的3*(1<
然后写了段代码,比较了一下性能(顺便说一句,这个编辑器对数学公式支持不好):
天数
耗时结果
备注
5
楼主的
316339
46
朋友的
118943
46
我的
105935
46
由此可见,我的方法效率要高一点点(计算30的时候要高出一个数量级),但是最多计算30天的时候(因为用的是移位算法,所以越位了),那位朋友的可以计算到第31天。
10
楼主的
376814
1534
朋友的
135666
1534
我的
109340
1534
15
楼主的
314625
49150
朋友的
149601
49150
我的
120337
49150
20
楼主的
304700
1572862
朋友的
135371
1572862
我的
123151
1572862
30
楼主的
325140
1610612734
朋友的
2917332
1610612734
我的
123089
1610612734
31
楼主的
348122
-1073741826
朋友的
142802
3221225470
我的
132409
-1073741826