一对兔子,从出生后第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,有可能是思路就是错误的,写代码首先要保证思路正确再去考虑代码有无错误