25 繁殖问题
作者: 孙辞海 时间限制: 1S章节: 一维数组
问题描述 :
有一家生化所,一月份引入一对新生的小白鼠。这对小白鼠生长两个月后,在第三、第四、第五个月各繁殖一对新小白鼠,在第六个月停止繁殖,在第七个月则死亡。新生的小白鼠也如此繁殖。问在第N个月时,活的小白鼠有多少对?
输入说明 :
你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据由一行组成,其中只有一个整数N(0 < N ≤ 50)。两组输入数据间无空行。
输出说明 :
对于每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的文本终端)输出一行,其中只有一个整数,即第N个月时活的小白鼠有几对,所有数据前后没有多余的空行,两组数据之间也没有多余的空行。
输入范例 :
1
2
3
4
5
6
7
8
30
输出范例 :
1
1
2
3
5
7
10
15
67066
这道题刚开始的时候想多了,以为没规律……
代码:
/*
T25 繁殖问题
算法概述:每月的小白鼠数量=往前一个月的+往前3~5个月新出生的-本月死亡的(
也就是往前7个月的新出生的)
*/
#include<stdio.h>
#define MAX_SIZE 52
int main() {
int N = 0;
int i = 0, j = 0;
int preBorn = 0;// 前3~5个月新出生的
int cur[MAX_SIZE] = {0, 1, 1, 2, 3, 5, 7, 10, 15};// 本月小白鼠数量
int newBorn[MAX_SIZE] = {0, 0, 0, 1, 1, 2, 2, 4, 5};// 本月新生小白鼠数量
for (i = 9; i <= 50; i++) {// 从第9个月开始,因为第8个月是特殊情况
preBorn = 0;
for (j = i - 4; j <= i - 2; j++)
preBorn += newBorn[j];
cur[i] = cur[i - 1] + preBorn - newBorn[i - 6];
newBorn[i] = preBorn;// 本月新生的
}
while (scanf("%d", &N) != EOF) {
printf("%d\n", cur[N]);
}
return 0;
}