一、说明
文章用于个人学习C++代码编写使用,前期只会简单的将代码粘贴上来,没时间整体说明。
后续会慢慢完善文章体系。
所有文章会放置在《C++代码编程》栏目里
所有的题目均来源于C语言网
ps:所有代码都是自己编写实现并通过的,可能不是最优解,后续会编写相应的最优解在文章后面
二、题目
题目描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入格式
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出格式
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2
4
5
0
样例输出
2
4
6
三、解题思路
思路:由题意可以知道,新出生的小牛需要等到第四年之后才会生一头新的母牛。也就是说前面四年都是由最开始的一头母牛进行生产,从第五年开始就有新的母牛生出新的小母牛。
即:从第五年开始,每年新出生的母牛都是在前四年生的母牛的基础上增加的。题目要问的是第n年共有多少头母牛,就是要把n年的全部加起来,这就需要使用到递归。列表如下:
年数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
总共母牛数 | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 | 28 |
理解如下:
前四年只有初始的一头母牛进行生产,故每年加一,但是从第5年开始,第2年出生的母牛也开始生产,故第5年由第2年的两头母牛进行生产。同理,第6年在原本一头母牛的基础上多了第3年出生的两头母牛生产新的牛,故第6年由第3年的三头母牛进行生产,以此类推。从而发现,count=year[n-1]+year[n-3]。又由于题目限制0<n<55,故得到代码
吐槽一句:前面四道入门题,突然就来一道中等题,布局非常不合理。而且还是递归题。
四、代码实现
循环实现:
#include<iostream>
using namespace std;
int main()
{
int n;
int count[55]={0,1,2,3,4}; //初始化定义数组,否则后续会报错
while(cin >> n && n != 0){ //当输入年份不为0时循环执行
for(int i = 5; i <= n; i++){ //从第五年开始计算第n年总共的母牛数
count[i] = count[i-1] + count[i-3]; //第五年开始总的母牛数等于前一年的母牛数加上前第三年的母牛数
}
cout << count[n] << endl; //输出第n年的母牛总数
}
return 0;
}
函数实现:
#include<iostream>
#include<string>
using namespace std;
int count(int n){ //定义一个递归调用的函数
if(n > 0 && n < 5) //当第1~4年的时候输出
return n;
else //否则调用递归计算第n年一共有多少头母牛
return count(n-1)+count(n-3);
}
int main()
{
int n; //定义变量
while(cin >> n && n != 0){ //当输入不为0的时候
cout << count(n) << endl; //输出第n年共有count(n)头母牛
}
return 0;
}
两种方法都可以实现,但是函数递归调用比较难想到,更容易想到的是使用循环,但有时候函数递归调用比循环更方便,因此,可以的话两种都掌握。