25 繁殖問題
作者: 孫辭海 時間限制: 1S章節: 一維數組
問題描述 :
有一家生化所,一月份引入一對新生的小白鼠。這對小白鼠生長兩個月後,在第三、第四、第五個月各繁殖一對新小白鼠,在第六個月停止繁殖,在第七個月則死亡。新生的小白鼠也如此繁殖。問在第N個月時,活的小白鼠有多少對?
輸入說明 :
你的程序需要從標準輸入設備(通常爲鍵盤)中讀入多組測試數據。每組輸入數據由一行組成,其中只有一個整數N(0 < N ≤ 50)。兩組輸入數據間無空行。
輸出說明 :
對於每組測試數據,你的程序需要向標準輸出設備(通常爲啓動該程序的文本終端)輸出一行,其中只有一個整數,即第N個月時活的小白鼠有幾對,所有數據前後沒有多餘的空行,兩組數據之間也沒有多餘的空行。
輸入範例 :
1
2
3
4
5
6
7輸出範例 :
1
1
2
3
5
7
10
15
67066
筆記
這題可以和基本練習-86 母牛的數量這一題放在一起看,兩題都是生殖問題,只是生殖規則不太一樣。
在本題中,易知當月小白鼠的對數=上一個月小白鼠的對數+當月新增的小白鼠對數。
而當月新增的小白鼠是分別由兩個月前、三個月前、四個月前新生的小白鼠生的。
另外,小白鼠活到第七個月時會死亡。所以在第七個月以後,當月小白鼠的對數還要再扣掉六個月前新增的小白鼠對數。
故,令第i個月的小白鼠對數爲total[i],第i個月新生的小白鼠對數爲b[i],則:
b[i] = b[i-2] + b[i-3] + b[i-4]
total[i] = total[i-1] + b[i] - b[i-6]
其中,i>6。
代碼
#include<stdio.h>
int main(){
int b[51],total[51];
b[0] = -1;
b[1] = 1;
b[2] = 0;
b[3] = 1;
b[4] = 1;
total[0] = -1;
total[1] = 1;
total[2] = 1;
total[3] = 2;
total[4] = 3;
int n;
int flag = 1;
while(scanf("%d",&n)!=EOF){
if(n<=4){
if(flag){
flag = 0;
}else{
printf("\n");
}
printf("%d",total[n]);
}else{
int i;
for(i=5;i<=n;i++){
b[i] = b[i-2] + b[i-3] + b[i-4];
total[i] = total[i-1] + b[i];
if(i>=7){
total[i] -= b[i-6];
}
}
if(flag){
flag = 0;
}else{
printf("\n");
}
printf("%d",total[n]);
}
}
return 0;
}