鱼C论坛

 找回密码
 立即注册
查看: 828|回复: 7

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

[复制链接]
发表于 2023-4-23 13:27:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

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

第一种情况:
ef93addd8c49344ad25fb08ea869a31.jpg
这种情况我认为比较简单!
#include<stdio.h>

int main()
{
    int min[24];
    int max[24];

    min[0] = 1;
    min[1] = 0;
    max[0] = 0;
    max[1] = 1;

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

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

    return 0;
}
第二种情况:
0bbd0af9c0329423a09b8b274008bd6.jpg
#include<stdio.h>

int main()
{
    int min[24];
    int max[24];

    min[0] = 1;
    min[1] = 1;
    max[0] = 0;
    max[1] = 0;

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

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

    return 0;
}

请各位大佬分析一下我的代码和草稿逻辑是否有问题!谢谢!
最佳答案
2023-4-24 17:14:53
兔子第二个月长大,第三个月开始生小兔子,它其实就是典型斐波那契数列问题,斐波那契数列性质是第一项是1,第二项是1,从第三项起每一项是前两项的和
当然本题除了要单纯的输出结果之外需要考虑小兔子和大兔子的数量

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

我直接帮你问了问gpt让它给你改代码
#include <stdio.h>

int main() {
    int month, adult_rabbits, baby_rabbits, total_rabbits;
    adult_rabbits = 0;
    baby_rabbits = 1;
    total_rabbits = 1;
    printf("Month  Adult  Baby  Total\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个月,计算每个月的兔子数量。每个月,未成年兔子的数量增加到成年兔子的数量,而成年兔子的数量增加到新生的未成年兔子的数量。最后,我们打印出每个月的成年兔子数量、未成年兔子数量和总兔子数量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-23 19:38:25 | 显示全部楼层
顶一下帖!求助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-23 22:17:27 | 显示全部楼层
怎么跟帖?求解答!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-24 09:10:23 From FishC Mobile | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-24 15:04:19 | 显示全部楼层
@小甲鱼 帮我顶一下帖可以吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-24 17:14:53 | 显示全部楼层    本楼为最佳答案   
兔子第二个月长大,第三个月开始生小兔子,它其实就是典型斐波那契数列问题,斐波那契数列性质是第一项是1,第二项是1,从第三项起每一项是前两项的和
当然本题除了要单纯的输出结果之外需要考虑小兔子和大兔子的数量

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

我直接帮你问了问gpt让它给你改代码
#include <stdio.h>

int main() {
    int month, adult_rabbits, baby_rabbits, total_rabbits;
    adult_rabbits = 0;
    baby_rabbits = 1;
    total_rabbits = 1;
    printf("Month  Adult  Baby  Total\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个月,计算每个月的兔子数量。每个月,未成年兔子的数量增加到成年兔子的数量,而成年兔子的数量增加到新生的未成年兔子的数量。最后,我们打印出每个月的成年兔子数量、未成年兔子数量和总兔子数量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-24 19:35:17 | 显示全部楼层
我记得我当时对这道题也有理解问题hh,直接看的答案看是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 11:17:16 | 显示全部楼层
这是一个经典的 Fibonacci 数列问题。第一种情况是 Fibonacci 数列的变形,从第三项起每一项都等于其前面两项之和,而第二种情况则取决于第零项和第一项不同。你的 C 代码实现了两种情况并且计算了每个月大兔子、小兔子和总兔子的数量,看起来正确无误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 22:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表