题目
分析
刚开始画了棵树,试图以父子关系寻找每代及其孩子的数量进而得到动态规划式。但将每年牛的数量列表后:(这里默认,第1年只有母牛1头牛)
年份 | 数量 |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 6 |
6 | 9 |
7 | 13 |
… | … |
记第 i 年母牛数量为 f[i] ,则 f[i]=f[i-1]+f[i-3] 。前3年的数量我们可以提前写出来,自第四年开始调用公式即可。
这里注意,由于年数 n :0<n<55,这个数量级我们可以提前将54个数组元素 f[i] 全部算出来,之后对输入直接判断即可,这会大大提高效率。
代码
#include<cstdio>
int main()
{
int n,m;
int i;
int yearnum[56] = { 0 };
yearnum[1] = 1;yearnum[2] = 2;yearnum[3] = 3;
for ( i = 4;i < 55;i++)
{
yearnum[i] = yearnum[i - 1] + yearnum[i - 3];
}
while (scanf("%d", &n)&&n)
{
printf("%d\n", yearnum[n]);
}
}
问题记录
这里记录一个问题,在判断输入不为0时结束时,使用while (scanf("%d", &n)&&n)
正常,而使用while ( scanf_s("%d", &n) != 0)
评测时会 runtime error 。
这是因为 scanf 函数返回的是成功读入的数据项数,如scanf( %d%d ,a,b);
,若 a、b 都被成功读入,则返回值为 2 ;若只有一个值成功读入,则返回值为 1 ;若都未被成功读入,则返回值为 0;若遇到错误或 end of file ,则返回值为 EOF 。
因此此处不能以while ( scanf_s("%d", &n) != 0)
进行判断n的取值,可换作逗号表达式while ( scanf_s("%d", &n) ,n)
,逗号表达式返回的是最右边的值。