A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wssjdysf 中级黑马   /  2013-11-7 15:20  /  1975 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/**
         * 有一对兔子,从出生后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时运行结果会有负数那是什么原因啊?还有我这解法对吗?

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

3 个回复

倒序浏览
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(剩下的)
代码的不写了,这种题真是想起来就头疼

   

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 唐宋元明清 于 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, 下载次数: 252)

你程序的运行结果,8月有13对。

你程序的运行结果,8月有13对。
回复 使用道具 举报
谢谢,各位的回复,我又想了想这兔子问题,头都大了。。。。晕
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马