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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-9 15:46  /  2091 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 史卜坤 于 2012-7-9 22:46 编辑

/*
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
*/
/* 1.程序分析: 兔子的规律为数列
1 2 3 4 5 6 7 月
2,2,4,6,10,16,26 个数 从第3个月开始前两个月之和等于本月的总数
*/
//(输入月份,然后求出兔子数)
package booktest;

import java.io.InputStreamReader;
import java.io.BufferedReader;

public class Number11{
public long getsumrabbit(long month){
long l1=2,l2=2;
long k,n=2;
if(month==1)
return 2;
if(month==2)
return 2;
else{
search :
for(k=3;k<=month;k++)
{

l1=l1+l2;
n++;
if(n==month){
return l2;
break search;
}
l2=l1+l2;
n++;
if(n==month){
return l1;
break search;
}
}

}
}

/*这里说我没有返回值 但我有啊返回L1和L2而且都是long类型的,我的另一个程序也出现了这样的问题,就在for循环底下加个IF的判断然后在加个返回的值,就说我没有返回的值!而且说break search;代码不可达.郁闷为什么这里不可以呢 ?*/


public static void main(String[] args) throws Exception{
System.out.println("请输入你想知道的月份");
BufferedReader month1 =new BufferedReader(new InputStreamReader(System.in));
String monthsum=month1.readLine();
long month=Integer.parseInt(monthsum); //当前String对象转成int
Number11 ss=new Number11();
System.out.println("这个月的兔子总共有:"+ss.getsumrabbit(month)+"只");


}

}

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 贾存双 于 2012-7-9 18:44 编辑

你把 Number11类   改成这样试试;
class Number11{
public long getSumRabbit(long month){  
  long mon[] = new long[month] ;  
  mon[0] = 2 ;
  mon[1] = 2 ;
  if(month==1||month==2){
   return this.mon[0] ;
  }else{
   for(i=2 ; i<mon.length ; i++){
    mon = mon[i-1] + mon[i-2] ;
   }
   return mon[month] ;
  }
}
};
回复 使用道具 举报
本帖最后由 刘馨琪 于 2012-7-10 15:55 编辑

在楼主原程序基础上改的。我没改算法,并且测试出算法有问题。
先说程序(改后:增加了一个long变量sum,结尾增加了一条return语句,把被long定义的数字后加了字母L):
  • public class Number11{
  •         public long getsumrabbit(long month){
  •                 long l1=2L,l2=2L;
  •                 long k,n=2L;
  •                 long sum=0;
  •                 if(month==1L||month==2L)
  •                 sum=2L;
  •                 else{
  •                         search :
  •                         for(k=3L;k<=month;k++){
  •                                 l1=l1+l2;
  •                                 n++;
  •                                 if(n==month){
  •                                         sum=l2;
  •                                         break search;
  •                                 }
  •                                 l2=l1+l2;
  •                                 n++;
  •                                 if(n==month){
  •                                         sum=l1;
  •                                         break search;
  •                                 }
  •                         }
  •                 }
  •                 return sum;
  •         }


    再说问题,当月份为123时,返回如下结果(出现负数):
请输入你想知道的月份
123
这个月的兔子总共有:-8112607375318472222只

请楼主检查算法。



评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public static long getsumrabbit(long month){
                long l1=2,l2=2;
                long k,n=2;
                if(month==1)
                return 2;
                if(month==2)
                        return 2;
                else
                        for(k=3;k<=month;k++)
                        {

                                l1=l1+l2;
                                n++;
                                if(n==month)
                                        return l2;
                       
                                l2=l1+l2;
                                n++;
                                if(n==month)
                                        return l1;
                        }
                return -1;//返回个-1.应付语法,就像返回个“”一样
        }
回复 使用道具 举报
public long getsumrabbit(long month){
long l1=2,l2=2;
long k,x,n=2;
if(month==1)
return 2;
if(month==2)
return 2;
else{
        x=month/2;
        if(month%2==0)
                x=x-1;
        for(k=0;k<x;k++){       
                l1=l1+l2;
                l2=l1+l2;
                if(month%2==0){ n=l2;}
                else { n=l1;}
        }
    return n;

}
}
回复 使用道具 举报
首先是lz的第一个问题
if(month==1)
return 2;
if(month==2)
return 2;
else{
      for(k=3;k<=month;k++)
      {
        l1=l1+l2;
        n++;
        if(n==month){
        return l2;
                 }
        l2=l1+l2;
        n++;
        if(n==month){
        return l1;
        }
        }
        return n;
}
上边是正确的

首先你的这个判断语句  总共有5条路径,所以必须5条返回return,你自己的少了一条else的返回return,虽然这个return不会用得着.

而关于你的search:话说从来没见过也没用过的说 — —
回复 使用道具 举报
我写一个简单一点的方法:
public class DemoTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
        
        System.out.println(Sum(8));
        }
        public static int Sum(int n)//n表示月份
{
                if(n==1||n==2)
                {
                        return(n);
                }
                else{
                        int sum=2;
                        for(int i=1;i<=(n-1)/2;i++)
                                sum+=2*(n-2*i);
                        return sum;
                }
        }

}
回复 使用道具 举报
上面的Sum(8)是表示第八个月的时候兔子的数量 做了一下测试
回复 使用道具 举报
楼主这个题你搞的太复杂了,自己写了个简单的算法,可以看一下
数字关系搞清楚就简单了,定义两个变量x , y 分别表示前两个月,然后定义 z 表示需要求的月份的总数
每一次循环都将 y的值赋值给x ,z的值赋值给y,然后求出一个新的 z,就能求出结果了。
  1. class  TuZi
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 System.out.println(getAll(7));
  6.         }
  7.         public static int getAll(int month)
  8.         {
  9.                 int x = 2;
  10.                 int y = 2;
  11.                 int z = 0;
  12.                 if (month==1||month==2)
  13.                 {
  14.                         return x;
  15.                 }else
  16.                 {
  17.                         for (int i=1; i<=month; i++)
  18.                         {
  19.                                 x = y;
  20.                                 y = z;
  21.                                 z = x+y;
  22.                         }
  23.                         return z;
  24.                 }
  25.         }
  26. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马