兔子产仔问题

【题目描述】
一般而言,兔子在出生2个月后就有繁殖能力,一对兔子每个月能生出一对小兔子来,如果所有兔子都不死,那么经过n个月总共有多少对兔子?
【输入描述】
输入由多组测试数据组成。第一行输入一个整数t,表示测试数据的组数。
接下来的t行,每行输入一个月份n。
【输出描述】
输出有t行,每行依次对应一个月份n的输出结果:经过n个月,每个月有多少对兔子。
【输入样例】
3
5
10
13
【输出样例】
1 1 2 3 5
1 1 2 3 5 8 13 21 34 55
1 1 2 3 5 8 13 21 34 55 89 144 233

public class Rabbit
{
final static int N=30;
static long f[] = new long[N];

/*斐波那契数组*/   
public static void fibonacciArray(int n)
{    

    f[0]=1;    
    f[1]=1;    
    for(int i =2;i < n;i++)
    {  
        f[i]=f[i-2]+f[i-1]; //数组的第三个数开始为前两个数的和   
    }    
        //  System.out.println(java.util.Arrays.toString(f)); //把数组转化成String输出   
}    

public static void print(long[] array)
{
    for(int i=0;i<array.length;i++)
    {
        if(array[i]==0)
            break;
        System.out.print(array[i]+" ");


    }
    System.out.println();
    for(int j=0;j<array.length;j++){
        array[j]=0;
    }

}


public static void main(String[] args) 
{
    Scanner in=new Scanner(System.in);
    int j=in.nextInt();
    int []n=new int[j];
    for(int i=0;i<=n.length-1;i++){
        n[i]=in.nextInt();
    }
    for(int k=0;k<=n.length-1;k++){
        fibonacciArray(n[k]);
        print(f);
    }
}    

}

### Java 实现斐波那契序列模拟兔子繁殖 #### 方法一:迭代法 通过循环结构来计算斐波那契数列,这种方法效率较高。 ```java public class RabbitPopulation { public static int fibonacci(int month) { if (month <= 1) return month; int previous = 0, current = 1; for (int i = 2; i <= month; ++i) { int next = previous + current; previous = current; current = next; } return current; } public static void main(String[] args) { int months = 12; // 假设要查看一年后的兔子数量 System.out.println("第" + months + "个兔子:" + fibonacci(months) + " 对"); } } ``` 此代码片段展示了如何利用迭代方式求解指定份的兔子对数[^1]。 #### 方法二:递归法 虽然简单直观但是性能较差,在处理较大数值时容易造成栈溢出错误。 ```java public class RecursiveRabbitPopulation { private static long fib(long n){ if(n<=1)return n; else return fib(n-1)+fib(n-2); } public static void main(String[]args){ long numMonths=12;// 计算十二个兔子的数量 System.out.printf("第%d个共有兔子:%d\n",numMonths,fib(numMonths)); } } ``` 这段程序采用递归来表示斐波那契关系,并输出给定时间点上的总兔群规模。 #### 面向对象设计 - 兔子类与管理器类组合方案 为了更贴近实际场景并体现面向对象的思想,可以创建`Rabbit`实体以及负责管理和操作这些实例的容器类`RabbitManager`. ```java class Rabbit { private final int birthMonth; public Rabbit(int birthMonth) { this.birthMonth = birthMonth; } boolean canReproduce(int currentMonth) { return (currentMonth - birthMonth >= 3); // 只有满三个才能生育 } } import java.util.ArrayList; import java.util.List; class RabbitManager { List<Rabbit> rabbits = new ArrayList<>(); void addNewbornPairs(int count) { for (int i = 0; i < count; i++) { rabbits.add(new Rabbit(rabbits.size())); } } int getTotalCount() { return rabbits.size(); } void simulateOneMonth() { int newbornPairsThisMonth = 0; for (var rabbit : rabbits) { if (rabbit.canReproduce(getTotalCount())) { newbornPairsThisMonth++; } } addNewbornPairs(newbornPairsThisMonth); } @Override public String toString(){ return "当前共有 "+getTotalCount()+" 对兔子"; } } // 测试用例 public class SimulationTest { public static void main(String[] args) throws Exception{ var manager=new RabbitManager(); manager.addNewbornPairs(1);// 初始条件设置为一对新生幼崽 for(int m=1;m<=12;++m){ // 进行为期一年的增长周期模拟 System.out.println(manager+" 第"+m+"个末."); Thread.sleep(500L); // 模拟延迟效果以便观察变化过程 manager.simulateOneMonth(); } } } ``` 上述实现不仅考虑到了每只成年母兔每月产仔的情况,还加入了简单的UI交互体验,使得整个模型更加生动形象[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值