黑马程序员技术交流社区

标题: 求助 给改下 [打印本页]

作者: 史卜坤    时间: 2012-7-9 15:46
标题: 求助 给改下
本帖最后由 史卜坤 于 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)+"只");


}

}
作者: 贾存双    时间: 2012-7-9 18:33
本帖最后由 贾存双 于 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:53
本帖最后由 刘馨琪 于 2012-7-10 15:55 编辑

在楼主原程序基础上改的。我没改算法,并且测试出算法有问题。
先说程序(改后:增加了一个long变量sum,结尾增加了一条return语句,把被long定义的数字后加了字母L):
请输入你想知道的月份
123
这个月的兔子总共有:-8112607375318472222只

请楼主检查算法。




作者: 陆强强    时间: 2012-7-10 16:32
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.应付语法,就像返回个“”一样
        }
作者: rslheima    时间: 2012-7-10 17:15
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;

}
}
作者: 张頔    时间: 2012-7-10 17:26
首先是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:话说从来没见过也没用过的说 — —
作者: 孙新强    时间: 2012-7-10 18:33
我写一个简单一点的方法:
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;
                }
        }

}

作者: 孙新强    时间: 2012-7-10 18:35
上面的Sum(8)是表示第八个月的时候兔子的数量 做了一下测试
作者: 吴小东    时间: 2012-7-11 00:35
楼主这个题你搞的太复杂了,自己写了个简单的算法,可以看一下
数字关系搞清楚就简单了,定义两个变量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. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2