时间限制: 1Sec 内存限制: 128MB
问题
问题描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2
4
5
0
样例输出
2
4
6
问题分析
年份 | 大奶牛 | 小奶牛 |
---|---|---|
1 | 1 | 0 |
2 | 1 | 1 |
3 | 1 | 1 |
4 | 1 | 1 |
5 | 2 | 2 |
6 | 3 | 3 |
7 | 4 | 4 |
8 | 6 | 6 |
注:当第n年的时候,第n-3(>0)年的小奶牛为0头,因为长大了
思路
前提:每个小奶牛四岁(也就是从出生开始后的第四年[三周岁])开始,长成大奶牛,每年年初都会生小奶牛。
传递:每当小奶牛长成大奶牛的时候,在出生的年分小奶牛为0头。
结果:本年份奶牛数量为:当前年分的大奶牛加上从本年开始往前推两年的小奶牛数量之和。
代码
这个代码是非递归的
#include <stdio.h>
int main()
{
int n;
int old[56]={0},fresh[56]={0},num[56]={0};
old[1]=1; fresh[1]=0;
for (int i = 2; i < 55; i++)
{
if (i <= 4) {
old[i] = 1;
fresh[i] = 1;
}
else
{
old[i] = fresh[i - 3] + old[i - 1];
fresh[i - 3] = 0;
fresh[i] = old[i];
}
num[i] = old[i] + fresh[i] + fresh[i - 1] + fresh[i - 2];
}
int input[55],index=0;
while (scanf("%d", &input[index]) != EOF&&input[index]!=0) index++;
for(int j=0;j<index;j++) printf("%d\n", num[input[j]]);
return 0;
}