兔子问题,java菜鸟编程

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

1 最直观的一种方法

package 兔子问题;

public class Rabbit {
int age;
public Rabbit(){
this.age=0;
}
public void setAge(){
this.age++;
}
public int getAge(){
return this.age;
}
public Rabbit born(){
return new Rabbit();
}
}

package 兔子问题;

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
public static void main(String[] args){
Scanner sc =new Scanner(System.in);
String temp;
int monthNum;
boolean run=true;
while(run){
System.out.println("请输入月份或者是exit退出");
temp=sc.nextLine();
if(temp.trim().equals("exit")){
System.out.println("系统退出了");
System.exit(0);
}else{
monthNum =Integer.parseInt(temp.trim());
System.out.println(getNum(monthNum));
}
}
}
public static int getNum(int n){
int num=1;
ArrayList rabbitArray =new ArrayList();
rabbitArray.add(new Rabbit());
for(int i=1;i<=n;i++){
for(int j=0;j
rabbitArray.get(j).setAge();
if(rabbitArray.get(j).getAge()>=3)
rabbitArray.add(rabbitArray.get(j).born());
}
}
num=rabbitArray.size();
return num;
}
}

2 通过分析题目我们发现:

题目分析:
* 第一个月: 兔子共1只
* 第二个月: 兔子共1只
* 第三个月: 兔子共2只
* 第四个月: 兔子共3只
* 第五个月: 兔子共5只
* 第六个月: 兔子共8只
* 第七个月: 兔子共13只
* 从中发现,从第三个月开始,前两个月兔子数之后为第三个兔子总数

故有程序:

package 兔子问题;

import java.util.Scanner;


public class Main2 {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String temp;
int monthNum;
boolean run=true;
while(run){
System.out.println("请输入月份或者是exit退出");
temp=sc.nextLine();
if(temp.trim().equals("exit")){
System.out.println("系统退出了");
System.exit(0);
}else{
monthNum=Integer.parseInt(temp.trim());
System.out.println(getNum(monthNum));
}
}

}
public static int getNum(int monthNum){
int pre1,pre2,now;
int i=0;
pre1=pre2=now=1;
if(monthNum<=0)
return 0;
if(monthNum==1||monthNum==2)
return now;
for(i=3;i<=monthNum;i++){
now=pre1+pre2;
pre1=pre2;
pre2=now;

}
return now;
}
}

3 在方法二的思路上使用迭代方法,程序如下:

package 兔子问题;


import java.util.Scanner;


/**
 * 采用迭代方法
 * **/
public class Main3 {
    public static void main(String[] args){
    Scanner sc=new Scanner(System.in);
    String temp;
    int monthNum;
    boolean run=true;
    while(run){
    System.out.println("请输入月份或者是exit退出");
    temp=sc.nextLine();
    if(temp.trim().equals("exit")){
    System.out.println("系统退出了");
    System.exit(0);
    }else{
    monthNum=Integer.parseInt(temp.trim());
    System.out.println(getNum(monthNum));
    }
    }
   
    }
    public static int getNum(int n){
    if(n==0)
    return 0;
    if(n==1|n==2){
    return 1;
    }
    else{
    return getNum(n-1)+getNum(n-2);
    }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值