【每日一题】牛客---统计每个月兔子的总数


原题链接: 统计总数

题目

描述
有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。
例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。
一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少?
数据范围:输入满足 1≤n≤31

输入描述:
输入一个int型整数表示第n个月

输出描述:
输出对应的兔子总数

示例1

输入:3
输出:2  

解题思路

通过对题目的分析可先列出前几个月的兔子数量的变化,比如第一个月到第六个月的数量依次是1,1,2,3,5,8,通过观察我们可以看出,从第三个月开始,每个月的数量就是前两个月的数目之和,这样我们就可以近似的将这道题看作是对斐波那契数的求解

解题方法及步骤

  1. 我们可以采取递归的思想进行求解,但我们需要注意的是当n过大时,它所开辟的栈帧会比较大
int fib(int n)
{
    if(n<= 2)
        return 1;
    return fib(n-1) + fib(n-2);
}
  1. 考虑到上面这种情况,我们可以用迭代的方法,也就是循环的方法进行求解
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;
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值