今天感觉还挺充实的,没有玩拳皇13,有点手痒……
晚上回寝室看到室友都在学习,也不好意思玩游戏,就找道题做。
题目
Problem Description
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
Output
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
Sample Input
2
4
5
0
Sample Output
2
4
6
这题我看了15分钟,就是瞅着眼熟,想着用递归做,却想不出具体做法……
后来才发现这不就和斐波那契数列一回事吗?
AC的代码
#include<stdio.h>
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
printf("%d\n",cows(n));
}
return 0;
}
int cows(int n)
{
if(0<n&&n<5)
return n;
else
return cows(n-1)+cows(n-3);
}
15分17秒看题加思考,4分51秒敲代码。
使用递归来做
每一年的母牛数都可以分解为上一年母牛数+年初产量
因为前四年都只有第一头母牛在生产,每年增加1头
f
(
n
)
=
f
(
n
−
1
)
+
1
,
n
≤
4
f(n)=f(n-1)+1,n≤4
f(n)=f(n−1)+1,n≤4 且
f
(
1
)
=
1
f(1)=1
f(1)=1
化简为
f
(
n
)
=
n
,
n
≤
4
f(n)=n,n≤4
f(n)=n,n≤4
当n>4时,每年都有新成熟的牛犊,
第n年时,年份为n-3存在的母牛全部生产且本年只有这些母牛生产
∴
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
3
)
,
4
<
n
f(n)=f(n-1)+f(n-3),4<n
f(n)=f(n−1)+f(n−3),4<n
然后直接写递归并调用就行了。
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
---|---|---|---|---|---|---|---|---|
28585244 | 2019-03-16 23:11:47 | Accepted | 2018 | 15MS | 1696K | 233 B | C | Overstars |
想要学数据结构,我又得滚回去学C Primer Plus第十四章了……
2019年3月16日23点36分