不死神兔
- 方法一之找规律
- 方法二之暴力
题目:有一个很有名的数学逻辑题叫做不死神兔问题。有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
方法一之找规律
通过这张图,我们可以明确的看到,一月有一只兔子,二月有一只,三月有两个,四月有五只。。。。。
得到一组数据(1,1,2,3,5,8,13…)我们可以发现,从三月开始,兔子数量为上两月之和。
那么就能操作了:
①定义一个数组
②将一月和二月的兔纸数量赋值
③循环计算每个月兔纸数量
④输出
参考代码:
public class Test04 {
public static void main(String[] args) {
//为了存储多个月的兔子对数,定义一个数组,用动态初始化完成数组元素的初始化,长度为20
int[] arr = new int[20];
//因为第1个月,第2个月兔子的对数是已知的,都是1,所以数组的第1个元素,第2个元素值也都是1
arr[0] = 1;
arr[1] = 1;
//用循环实现计算每个月的兔子对数
for(int x=2; x<arr.length; x++) {
arr[x] = arr[x-2] + arr[x-1];
}
//输出数组中最后一个元素的值,就是第20个月的兔子对数
System.out.println("第二十个月兔子的对数是:" + arr[19]);
}
}
方法二之暴力
找规律什么的才不喜欢,还是比较喜欢暴力,当然,暴力也是需要找一点点规律的,不然怎么暴力啊
月 | 一月 | 二月 | 三月 |
第一月 | 1 | 0 | 0 |
第二月 | 0 | 1 | 0 |
第三月 | 1 | 0 | 1 |
第三月 | 1 | 1 | 1 |
根据题意,兔子会长大,当兔子长到第三个月的时候,会生一个一月的兔子。因为兔子会长大,由此,可以判断出,下个月新生的兔子数量,将会等于上个月出生的兔子数量,而上个月出生的兔子数量是由二月和三月决定的(因为二月会长成三月),所以下个月新生的兔子数量等于上个月二月加三月之和,而下个月二月的兔子数量自然等于上个月一月兔子的数量,因为长大了,同理,下个月三月的兔子数量等于上个月二月加三月(因为兔子是不死的)。这么多字可能看懵了吧,下面是操作流程
①定义一月、二月和三月的兔子,并赋初值
②定义下个月中一月、二月、三月的兔纸,赋初值为零(这里有个注意事项,我运行过程中才发现的,因为下个月一月的兔子是由上个月二月和三月共同决定的,而下个月的三月的兔子也是由上个月二月和三月决定的,所以他们相等,也就是说下个月的三月兔子是不用定义的)
③定义循环
④输出结果
代码有瑕疵,将就着看吧
public class ImmortalRabbit {
public static void main(String[] args) {
int yiyue=1,eryue=0,sanyue=0;
int yiyueti=0,eryueti=0,sanyueti=0;
for(int i=0;i<19;i++){
yiyueti=yiyue;
eryueti=eryue;
// sanyueti=sanyue;
eryue=yiyueti;
sanyue+=eryueti;
yiyue=sanyue;
}
System.out.println(yiyue+eryue+sanyue);
}
}