a905448839 发表于 2023-4-23 13:27:35

之前在新生乐园求助未解决的题

这是一个有趣的古典数学问题:如果说兔子在出生两个月后,就长大了,有繁殖能力,在拥有繁殖能力之后,这对免了每个月能生出一对小兔子来,假设所有兔子都不会死去,能够一直生下去,那么两年之后可以繁殖多少对兔了呢?   
C语言代码
要求:打印出1月到24月大兔子 小兔子 和总兔子数量

今天重新草稿演算了一下,最开始没完全理解题目,现在区分了两种情况:

1:小兔子第二月就长大成大兔子,第三月才能生兔子(这是《带你学C带你飞》的拾遗那一章节的课后作业)这里便是第二月兔子长大,第三月生兔子。
2:我读题认为成了:小兔子第三月长大,同时在第三月生小兔子。

现在针对两种情况我把如下代码和草稿列出,请判断正确性。(两种情况好像只是大小兔数量不一样,总数一样 大小颠倒)

第一种情况:

这种情况我认为比较简单!
#include<stdio.h>

int main()
{
    int min;
    int max;

    min = 1;
    min = 0;
    max = 0;
    max = 1;

    printf("第1月大兔子%d对\n", max);
    printf("第1月小兔子%d对\n\n", min);
    printf("第2月大兔子%d对\n", max);
    printf("第2月小兔子%d对\n\n", min);

    int n;
    for(n = 2; n < 24; n++)
    {
      max = max + min;//这个就比较好理解了 因为小兔子第二月就长大了 大兔子就等于上个月的和
      min = max; //很简单 上个月的大兔子(无论是刚长大 还是长大很久的)都可以在这个月生兔子了
      printf("第%d月大兔子%d对\n", n+1, max);
      printf("第%d月小兔子%d对\n", n+1, min);
      printf("第%d月总兔子%d对\n\n", n+1, max+min);
    }
    printf("两年后总兔子:%d\n", min + max);

    return 0;
}
第二种情况:

#include<stdio.h>

int main()
{
    int min;
    int max;

    min = 1;
    min = 1;
    max = 0;
    max = 0;

    printf("第1月大兔子%d对\n", max);
    printf("第1月小兔子%d对\n\n", min);
    printf("第2月大兔子%d对\n", max);
    printf("第2月小兔子%d对\n\n", min);

    int n;
    for(n = 2; n < 24; n++)
    {
      max = max + min;//当月大兔子=上上月总兔子
                //为什么不是=上月大兔子+上上月小兔子呢? 因为上月的大兔子和上上月的小兔子有部分是同一对
      min = max + min;//当月小兔子=本月大兔子+上上月小兔子
                //为什么不+上月小兔子? 因为上月小兔子有部分在本月长大是前面本月大兔子同一只
      printf("第%d月大兔子%d对\n", n+1, max);
      printf("第%d月小兔子%d对\n", n+1, min);
      printf("第%d月总兔子%d对\n\n", n+1, max+min);
    }
    printf("两年后总兔子:%d\n", min + max);

    return 0;
}

请各位大佬分析一下我的代码和草稿逻辑是否有问题!谢谢!

a905448839 发表于 2023-4-23 19:38:25

顶一下帖!求助!

a905448839 发表于 2023-4-23 22:17:27

怎么跟帖?求解答!

a905448839 发表于 2023-4-24 09:10:23

a905448839 发表于 2023-4-24 15:04:19

@小甲鱼 帮我顶一下帖可以吗?

王逗比666 发表于 2023-4-24 17:14:53

兔子第二个月长大,第三个月开始生小兔子,它其实就是典型斐波那契数列问题,斐波那契数列性质是第一项是1,第二项是1,从第三项起每一项是前两项的和
当然本题除了要单纯的输出结果之外需要考虑小兔子和大兔子的数量

所以你直接按照第一个理解就可以了,不过这道题不需要用到数组,直接修改变量效率会更高

我直接帮你问了问gpt让它给你改代码{:10_256:}

#include <stdio.h>

int main() {
    int month, adult_rabbits, baby_rabbits, total_rabbits;
    adult_rabbits = 0;
    baby_rabbits = 1;
    total_rabbits = 1;
    printf("MonthAdultBabyTotal\n");
    printf("   1      0   1      1\n");
    for (month = 2; month <= 24; month++) {
      int new_babies = adult_rabbits;
      adult_rabbits += baby_rabbits;
      baby_rabbits = new_babies;
      total_rabbits = adult_rabbits + baby_rabbits;
      printf("%5d%7d%7d%7d\n", month, adult_rabbits, baby_rabbits, total_rabbits);
    }
    return 0;
}

代码中,我们使用了四个变量:month表示当前月份,adult_rabbits表示成年兔子的数量,baby_rabbits表示未成年兔子的数量,total_rabbits表示总兔子数量。在代码的开始处,我们将成年兔子数量、未成年兔子数量、总兔子数量初始化为1,因为在第一个月有一对兔子。然后,我们使用for循环遍历24个月,计算每个月的兔子数量。每个月,未成年兔子的数量增加到成年兔子的数量,而成年兔子的数量增加到新生的未成年兔子的数量。最后,我们打印出每个月的成年兔子数量、未成年兔子数量和总兔子数量。

yinda_peng 发表于 2023-4-24 19:35:17

我记得我当时对这道题也有理解问题hh,直接看的答案看是什么意思

陶远航 发表于 2023-5-20 11:17:16

这是一个经典的 Fibonacci 数列问题。第一种情况是 Fibonacci 数列的变形,从第三项起每一项都等于其前面两项之和,而第二种情况则取决于第零项和第一项不同。你的 C 代码实现了两种情况并且计算了每个月大兔子、小兔子和总兔子的数量,看起来正确无误。
页: [1]
查看完整版本: 之前在新生乐园求助未解决的题