如圖,此題難度較大,要用到隊列(我優化為循環隊列)
運行結果,兔子數量變化符合斐波那契數列(下面壹行數字為0~6歲每半歲兔子數量)
如圖,如有疑問或不明白請追問哦!
源代碼如下:(網頁端比較好看哦)
#include<stdio.h>#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<LIFETIME;?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?; //老兔的位置換成新兔
}
}