黑马程序员技术交流社区
标题:
经典Java兔子生兔子的问题
[打印本页]
作者:
wssjdysf
时间:
2013-11-7 15:20
标题:
经典Java兔子生兔子的问题
/**
* 有一对兔子,从出生后3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,
* 假如兔子不死,问每个月兔子总数为多少?
* @author JSON
*
*/
private static long one=1,two,three;//one,two,three分别代表出生了一个月的兔子,出生了二个月的兔子,
//出生了三月以上的兔子
public static void main(String[] args) {
for (int i = 1; i < 99; i++) {
goMon(i);
System.out.println("---------第"+i+"月有"+(one+two+three)+"对兔子-------");
}
}
/**
* 过了一个月
* @param i
*/
public static void goMon(int i){
//临时变量
long tempOne = one;
long tempTwo = two;
long tempThree = three;
one = tempThree;
two = tempOne;
three += tempTwo;
System.out.println("第"+i+"月,one="+one+",two="+two+",three="+three+"对兔子");
}
当我把long的地方换成int时运行结果会有负数那是什么原因啊?还有我这解法对吗?
作者:
零下五度的水
时间:
2013-11-7 16:24
1. int类型的范围是大概 正负20亿左右,就是说如果一个int 类型的最大值+1=int 类型的最小值,
从正20多亿瞬间变成负20多亿,你这个负数就是因为这个
2. 你这解法明显不对。第1月,one=0,two=1,three=0对兔子:第一个月明显应该one=1,two=0
而且我完全没看懂你的思路
这个是Fibonacci数列:1,1,2,3,5,8,13,21。。。。。一般是用迭代来做的
迭代类问题的一般思路:你要是想算出one,two,three的话,先把1234567...月的数据列出来找规律
one:1 0 1 1 2 3 5
two:0 1 0 1 1 2 3
thre : 0 0 1 1 2 3 5
可以看出除了开头,后面的数据one,two,three 本身仍是fibonacci数列
其实要简单点的话,
one=第n月总数-第n-1月总数(这个月增加的)
two=第n-1月总数-第n-2月总数(上个月增加的)
three=第n月总数-one-two(剩下的)
代码的不写了,这种题真是想起来就头疼
作者:
唐宋元明清
时间:
2013-11-7 16:35
本帖最后由 唐宋元明清 于 2013-11-7 16:42 编辑
当数值超出int范围后,数字会变成负数,如 int i=0xdfff ffff;System.out.println(i+1);结果就为-268435456。
你这题的解法,我看了下结果是错误的。
最原始兔子
一月:1
二月:1
三月:1
四月:1+1
五月:1+1+1
六月:1+1+1+1 第四月生的兔子后代
七月:1+1+1+1+1 +1 第五个月生的兔子的后代
八月:1+1+1+1+1+1 +1+1 +1。。。
八月的时候应该有9只。
具体解法,我暂时也没想出来。。。
run.JPG
(117.99 KB, 下载次数: 290)
下载附件
2013-11-7 16:08 上传
你程序的运行结果,8月有13对。
作者:
wssjdysf
时间:
2013-11-7 21:10
谢谢,各位的回复,我又想了想这兔子问题,头都大了。。。。晕
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2