7-5 兔子繁衍问题

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:

输入在一行中给出一个不超过10000的正整数N。

输出格式:

在一行中输出兔子总数达到N最少需要的月数。

_____________________________________________________________________________

以下为我自己的思路过程:

第一次的思路:

兔子出生后每3个月才能生,三个月后每月都生,那么第二对出生的兔子在之后只与第一对兔子少生3对(第二对要等3个月),第三对兔子只比第二对少生3对.....因此判断这是一个等差数列,只要用等差数列求和公式就可以得到总共的兔子数量,再设置计数器累积月份即可。

代码如下:

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner reader=new Scanner(System.in);
        int N=reader.nextInt();
        int month=1,d=3,a=1;
        int result=month*a+3*((month-1)*month)/2;
        while(result<N){
            month++;
            result=month*a+3*((month-1)*month)/2;//等差数列求和公式
        }
        System.out.print(month);
    }
}

运算结果:

正确答案为9,与正确答案不一致;

第二次思路:

先列出月份1,2,3,4......再在每个月份下写兔子的数量;第一个月为1对兔子,第二个月为1对兔子,第三个月有2对兔子(第一对生的,接下来第一对每月生一个),第四个月为3对兔子,第五个月为5对兔子(增加的是第二对和第一对生了两对兔子),第六个月为8对兔子(增加的是第一个月,第三个月,第四个月的三对兔子生的),第七个月为13对(增加的是第一个月1对,第三个月1对,第四个月1对,第五个月是第1对和第3对同时生下的两对,他们也生下两对,一共5对)。。。。寻找规律发现,第N个月的兔子总数是N-1个月兔子总数+N-2个月兔子总数之和,由此可见这不是等差数列,按照此规律,设置R2,R1,TEMP表示N,N-1,N-2三个月兔子数据。当N小于等于1时,月数等于1,大于等于1时,月数大于等于3,开始进行循环内容:先将R1存给temp,在将R2赋给R1,R2=R1+temp。若R2小于N,继续循环,每次循环月份加一,具体代码如下:

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner reader=new Scanner(System.in);
        int N=reader.nextInt();
        int month=2;//兔子数大于1则月份数从2开始累加
        int R1=1,R2=1,temp=0;
        if(N<=R2){
            System.out.printf("1",month);
        }//兔子数少于等于1月份为1
        if(N>R2) {
            while (R2 < N) {
                temp = R1;
                R1 = R2;
                R2 = temp + R2;
                month++;//相当于第n个月的兔子数为n-1月兔子数+n-2月的兔子数
            }
            System.out.printf("%d",month);
        }  
    }
}

运行结果:

答案正确,接下来测试PTA平台是否通过:

平台测试通过

总结:

分析问题的时候如果发现答案不一致不一定是代码出现了BUG,有可能是思路就是错误的,写代码首先要保证思路正确再去考虑代码有无错误

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值