黑马程序员技术交流社区
标题:
求助 给改下
[打印本页]
作者:
史卜坤
时间:
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):
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只
请楼主检查算法。
作者:
陆强强
时间:
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,就能求出结果了。
class TuZi
{
public static void main(String[] args)
{
System.out.println(getAll(7));
}
public static int getAll(int month)
{
int x = 2;
int y = 2;
int z = 0;
if (month==1||month==2)
{
return x;
}else
{
for (int i=1; i<=month; i++)
{
x = y;
y = z;
z = x+y;
}
return z;
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2