C语言编程:兔子繁殖问题

这个怎么求?
2024-11-29 06:35:27
推荐回答(1个)
回答1:

如图,此题难度较大,要用到队列(我优化为循环队列)(此题有两个提问,都是我回答所以一样)

运行结果,兔子数量变化符合斐波那契数列(下面一行数字为0~6岁每半岁兔子数量)

源代码:(网页端才完整)

#include
#define LIFETIME 13 //兔子寿命,单位半年(年龄小于此!)
#define INITNUM 1 //初始兔子有多少对
main()
{
int hY=0; //兔子历(就是时刻表):单位:半年
int num[LIFETIME]={INITNUM,0}; //存储不同年龄兔子的对数(初始为0岁1对)
//babyI下标代表0岁,往前年龄增大,越过数组下界跳到上界,所以babyI+1反而是最老兔子
int babyI=0; //0岁兔子对应下标,年龄单位为半年
int loveNum=0; //可生育兔子数量
int totalNum=INITNUM; //总计兔子数量
int age1I=LIFETIME-2; //1岁兔子对应下标(开始能生育)
int age5_5I=LIFETIME-11; //1岁、5.5岁兔子对应下标(刚好能生育、刚好不能生育年龄)
int n=30; //输入n半年后!
while(hY <= n){
int i,j; //遍历临时变量。①展示兔子数量。
printf("第%.1f年\t总计:%d对\t可生育:%d对\n",(float)hY/2,totalNum,loveNum);
/*
for(i=0; i printf("%.1f岁\t",(float)i/2 ); //打印表头
//printf("%d,%.1f岁\t",i,(float)(++i)/2 ); //打印表头
}printf("单位:对\n"); //换行*/
i=babyI; //显示各年龄对应数量
j=0;
do{
//printf("%d\t",num[i]);
if(hY<21){ //仅用于加\t显示
if((++j)%2==0)printf("\t");}
printf("%d ",num[i]);
if(i>0)i--; //下标循环往左移动
else i=LIFETIME-1;
}while(i!=babyI);
printf("\n"); //换行

//②半年后
hY++; //时间过去半年
age1I= (age1I+1)%LIFETIME ; //1岁数量(对)对应下标
age5_5I= (age5_5I+1)%LIFETIME ;//5.5岁数量(对)对应下标
//printf("%d,%d\n",age1I,age5_5I);
loveNum += num[age1I] -num[age5_5I]; //可生育兔子数量(对)

babyI = (babyI+1)%LIFETIME; //新babyI设为原最老兔子的下标,
totalNum += loveNum - num[babyI]; //每对大兔子可以生一对小兔子 - 死亡的老兔
num[babyI] = loveNum ; //老兔的位置换成新兔
}
}