题目描述:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入描述:
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
输出描述:
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
输入例子:
2
4
5
输出例子:
2
4
6
话不多说,典型的递推规律题,我们先计算几个结果:
注:(老母牛代表n ≥ 4)
老母牛 | 初生 | 2年 | 3年 | 总数 | |
---|---|---|---|---|---|
第1天 | 1 | 0 | 0 | 0 | 1 |
第2天 | 1 | 1 | 0 | 0 | 2 |
第3天 | 1 | 1 | 1 | 0 | 3 |
第4天 | 1 | 1 | 1 | 1 | 4 |
第5天 | 2 | 2 | 1 | 1 | 6 |
第6天 | 3 | 3 | 2 | 1 | 9 |
不难发现一个规律f(n) = f(n - 1) + f(n - 3)(当n ≥ 4)
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
//建立一张表,用于f(n)各项值,需要使用long long类型,否则会产生溢出
long long fTable[56] = {0, 1, 2, 3};
//注意数组下标从0开始,而计算从1开始
for (int i = 4; i < 56; ++i) {
fTable[i] = fTable[i - 1] + fTable[i - 3];
}
int number = 0;
//scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
while (scanf("%d", &number) != - 1) {
printf("%lld\n", fTable[number]);
}
return 0;
}