原题链接: 统计总数
题目
描述
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足 1≤n≤31
输入描述:
输入一个int型整数表示第n个月
输出描述:
输出对应的兔子总数
示例1
输入:3
输出:2
解题思路
通过对题目的分析可先列出前几个月的兔子数量的变化,比如第一个月到第六个月的数量依次是1,1,2,3,5,8,通过观察我们可以看出,从第三个月开始,每个月的数量就是前两个月的数目之和,这样我们就可以近似的将这道题看作是对斐波那契数的求解
解题方法及步骤
- 我们可以采取递归的思想进行求解,但我们需要注意的是当n过大时,它所开辟的栈帧会比较大
int fib(int n)
{
if(n<= 2)
return 1;
return fib(n-1) + fib(n-2);
}
- 考虑到上面这种情况,我们可以用迭代的方法,也就是循环的方法进行求解
int fib(int n)
{
int f,f1 = 1,f2 = 1;
for(int i = 3;i <= n;i++)
{
f = f1 + f2;
f1 = f2;
f2 = f;
}
return f;
}
完整代码
#include <iostream>
using namespace std;
int fib(int n)
{
int f,f1 = 1,f2 = 1;
for(int i = 3;i <= n;i++)
{
f = f1 + f2;
f1 = f2;
f2 = f;
}
return f;
}
/*
int fib(int n)
{
if(n<= 2)
return 1;
return fib(n-1) + fib(n-2);
}
*/
int main() {
int n;
while(cin>>n)
{
cout<<fib(n)<<endl;
}
return 0;
}