首页 > 试题广场 >

统计每个月兔子的总数

[编程题]统计每个月兔子的总数
  • 热度指数:257635 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}有一种兔子,从出生后第三个月起,每个月都会生一只兔子,生出来的兔子同理。假设兔子都不死,求解第 n 个月时的兔子总数。

输入描述:
\hspace{15pt}在一行上输入一个整数 n \left(1 \leqq n \leqq 31\right) 代表查询的月份。


输出描述:
\hspace{15pt}在一行上输出一个整数,代表第 n 个月的兔子总数。
示例1

输入

3

输出

2

说明

\hspace{15pt}第一个月时,只有初始兔子(记为 r_0 ),此时兔子总数为 1
\hspace{15pt}第二个月时,依旧只有 r_0 ,此时兔子总数为 1
\hspace{15pt}第三个月时,r_0 开始生兔子(记生出来的兔子为 r_1 ),此时兔子总数为 2
\hspace{15pt}第四个月时,r_0 再生一只兔子,此时兔子总数为 3
\hspace{15pt}第五个月时,r_0 再生一只兔子,与此同时 r_1 也开始生兔子,此时兔子总数为 5
示例2

输入

5

输出

5
#include <stdio.h>
//出生后第三个月即就是出生两个月后,有几个会生崽就有几个会出生
int main() {
    int n = 0;
    int m[31] = {0}; //第n个月会生崽的兔子数量
    int num = 1; //兔子总数
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        if (i < 3) {
            m[i] = 0;
        } else if (i == 3) {
            m[i] = 1;
        } else {
            m[i] = m[i - 1] + m[i - 2];//第n个月会生崽的兔子数量等于第n-1个月会生崽的兔子数量加上第n-2个月的
        }
        num += m[i];//第n个月兔子的总数等于第n-1个月兔子的总数加上第n个月会生崽的兔子的数量
    }
    printf("%d",num);
    return 0;
}

发表于 2024-12-14 04:27:50 回复(0)
#include <stdio.h>
int main()
{
int n;
while(~scanf("%d", &n)) {
int num1 = 1, num2 = 1, ret = 0;
for (int i = 2; i < n; i++) {
ret = num1 + num2;
num1 = num2;
num2 = ret;
}
printf("%d\n", ret);
} 
return 0;
} 这其实是一个斐波那契数列。第 n 个月的兔子数量实际上就是第 n-1 个斐波那契数。 用循环实现可以避免过度递归

发表于 2024-10-19 16:12:40 回复(0)
//斐波那契数列
#include <stdio.h>

int func(int n) {
    if (n == 2 || n == 1)
        return 1;
    return func(n - 1) + func(n - 2);
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        printf("%d\n", func(n));
    }
    return 0;
}

发表于 2024-09-12 20:13:23 回复(0)
#include <stdio.h>
int main() {
    int moon=0;
    scanf("%d", &moon);
    int lastmoon=1;
    int thismoon = 1;
    int nextmoon = 1;
    for(int i=2;i<=moon;i++){
        nextmoon = thismoon+lastmoon;
        lastmoon = thismoon;
        thismoon = nextmoon;
       
    }
    printf("%d", lastmoon);
    return 0;
}
发表于 2024-08-06 12:00:22 回复(0)
#include <stdio.h>
int main() {
    int n;
    scanf("%d",&n);
    int a=1;
    int b=1;
    int c=1;
    while(n)
    {
        a=b;
        b=c;
        c=a+b;
        n--;
    }
    printf("%d",a);
    return 0;
}

发表于 2024-05-05 23:09:36 回复(0)
#include <stdio.h>

int main() {
//1 * 1
//2. * 1
//3. * * 2
//4. * * * 3
//5. ** * ** 5
//6. *** ** ***. 8
//7. ***** *** ***** 13

int arr[32] = {0};
int num;

scanf("%d", &num);

arr[0] = 1;
arr[1] = 1;

for(int i = 2;i < 32; i++){
arr[i] = arr[i - 1] + arr[i - 2];
}

printf("%d\n", arr[num - 1]);

return 0;
}
发表于 2024-02-19 09:22:25 回复(0)
#include <stdio.h>
int main() {
    int n;
    scanf("%d",&n);
    int adult = 0, two = 0, one = 0;
    for (int i = 1; i <= n; i++) {
        adult += two;
        two  = one;
        if(i==1) one = 1;
        else one = adult;
    }
    printf("%d",adult+two+one);
    return 0;
}

编辑于 2023-12-02 22:23:44 回复(0)
//画图,然后简单的斐波拉契数列
#include <stdio.h>

int num(int n)
{
    if(n == 1||n==2)
    {
        return 1;
    }
    return num(n-1)+num(n-2);
}

int main() {
    int n=0;
    while (scanf("%d", &n) != EOF) {
        printf("%d\n",num(n));
    }
    return 0;
}

发表于 2023-10-10 21:17:33 回复(0)
#include <stdio.h>

int main() 
{
    int new_habbit = 0;
    int one_habbit = 0;
    int old_habbit = 1;

    int month = 0;
    scanf("%d",&month);

    if(month < 3)
    {
        printf("%d",1);
        return 1;
    }

    int k = 3;
    while(k <= month)
    {
        old_habbit += one_habbit;
        one_habbit = new_habbit;       
        new_habbit = old_habbit;      
        k++;
    }

    printf("%d",new_habbit+one_habbit+old_habbit);
    return 0;
}

发表于 2023-08-01 09:31:10 回复(0)
这不就斐波那契数列么?
#include <stdio.h>

int main() {
    int n = 0;
    scanf("%d", &n);
    int a1 = 1;
    int a2 = 1;
    int a3 = 0;
    while(n--)
    {
        a1 = a2;
        a2 = a3;
        a3 = a1 + a2;
    }

    printf("%d", a3);
    return 0;
}

发表于 2023-03-15 15:54:14 回复(0)
#include <stdio.h>

int main() {
    //递归,初始条件递归条件之间的应用;
    int num[32]={1,1};
    for(int i=2;i<32;i++){
        num[i]=num[i-2]+num[i-1];
    }
    int n;
    scanf("%d",&n);
    printf("%d\n",num[n-1]);
    return 0;

}
标准斐波那契数列,先推导出表达式,再直接进行数据的输出即可
发表于 2023-01-01 17:02:07 回复(0)
#include <stdio.h>

int main()
{
  int mon[3] = {1};
  char month, i;
  
  scanf("%d", &month);
  for(i = 1; i < month; i++)
  {
    mon[2] += mon[1];  // 能生育兔子
    mon[1] = mon[0];   // 发育中的兔子
    mon[0] = mon[2];   // 新生的兔子
  }
  
  printf("%d", mon[0] + mon[1] + mon[2]);
}

发表于 2022-08-16 17:41:12 回复(2)
递归:
#include <stdio.h>

int fib(int n){
    if(n<3){
        return 1;
    }
    else{
        return fib(n-1)+fib(n-2);
    }
}

int main(){
    int n;
    scanf("%d",&n);
    printf("%d",fib(n));
} 
递归优化:
#include <stdio.h>
int a[32];

int rb(int n){
    if(n<3){
        return 1;
    }
    else{
        if(a[n]==0){
            a[n]=rb(n-1)+rb(n-2);
        }
        return a[n];
    }
}

int main(){
    int n;
    scanf("%d",&n);
    printf("%d",rb(n));
} 
动态规划:
#include <stdio.h>

int rb(int n){
    if(n<3){
        return 1;
    }
    int dp[n+1];
    dp[1]=dp[2]=1;
    for(int i=3;i<n+1;i++){
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
}

int main(){
    int n;
    scanf("%d",&n);
    printf("%d",rb(n));
} 
动态规划优化:
#include <stdio.h>

int rb(int n){
    if(n<3){
        return 1;
    }
    int a,b,c;a=b=1;
    for(int i=3;i<n+1;i++){
        c=a+b;a=b;b=c;
    }
    return c;
}

int main(){
    int n;
    scanf("%d",&n);
    printf("%d",rb(n));
} 
发表于 2022-05-28 11:04:50 回复(0)
#include <stdio.h>
int rabbit(int n)
{
    if(n<3)
    {
        return 1;
    }
    else
    {
        return rabbit(n-1)+rabbit(n-2);
    }
}
int main()
{
    int n,cnt;
    scanf("%d",&n);
    printf("%d\n",rabbit(n));
    return 0;
}
用递归或者动态规划都可以
发表于 2022-04-20 11:51:03 回复(0)
struct newbaby
{
    int old;
    int num;
};
int main()
{
    int n = 0;
    
    struct newbaby moun[32] = { 0 };//每个月的新生数
    int EvMounSum[32] = { 0,1 };
    moun[1].num = 1;
    moun[1].old = 1;
    for (int i = 2; i <= 31; i++)//填入这个月新生兔子数;填入这个月的兔子总数(新生+已有)
    {
        int sum = 0;
        for (int j = 1; j < i; j++)//加年龄并算新生总数
        {
            moun[j].old++;
            if (moun[j].old >= 3)
            {
                sum += moun[j].num;
            }
        }
        if (sum != 0)
        {
            moun[i].num = sum;//赋值相当于出生
            moun[i].old++;//出生就是一岁
        }
        EvMounSum[i] = sum + EvMounSum[i - 1];//填入总数
    }
    while(~scanf("%d",&n))
    {
        printf("%d\n",EvMounSum[n]);
    }
}
1.制表
2.循环输出
制表方法:
1.在struct newbaby moun[32]中保存每个月的出生数并记录这个月出生兔兔的年龄为1岁
2.循环让每个月的兔子长一岁,以便之后判断这个月生的兔兔是否能生。
3.再创建一个数组,计算每个月兔子的总和(这个月新生的兔子数+上个月已有兔子数)

发表于 2022-02-13 18:24:08 回复(0)
#include<stdio.h>
int fb_t(int n)
{
    if (n <= 2)
        return 1;
    else 
        return fb_t(n - 1) + fb_t(n - 2);
}
int main()
{
    int n = 0;
    while (scanf("%d", &n) != EOF)
    {
        fb_t(n);
        printf("%d\n", fb_t(n));
    }
    return 0;
}

发表于 2022-02-02 00:46:35 回复(0)
#include<stdio.h>

int count(int n)
{
    if(n==1||n==2)
        return 1;
    else
        return count(n-1)+count(n-2);
}

int main()
{
    int num,res;
    while(scanf("%d",&num)!=EOF)
    {
        res = count(num);
        printf("%d\n",res);
    }
}

发表于 2021-08-21 22:51:40 回复(0)
实际为斐波那契数列
#include<stdio.h>
int main(){
    int month;
    while(scanf("%d", &month) != EOF){
        int chusheng[month],chengzhang[month],chengnian[month],num;
        chengnian[0] = 1;
        chengzhang[0] = 0;
        chusheng[0] = 0;
        if(month >= 2){
            chengnian[1] = 1;
            chengzhang[1] = 0;
            chusheng[1] = 0;
        }
        for(int date = 2; date < month; date++){
            chengnian[date] = chengnian[date-1] + chengzhang[date -1];
            chengzhang[date] = chusheng[date -1];
            chusheng[date] = chengnian[date];
        }
        num = chusheng[month -1] + chengzhang[month -1] + chengnian[month -1];
        printf("%d\n", num);
    }
}
发表于 2021-08-16 11:42:04 回复(0)
最后要输入两次月份,无语了
发表于 2021-07-15 00:13:47 回复(0)