鱼C论坛

 找回密码
 立即注册
查看: 1913|回复: 11

[已解决]难题求解!

[复制链接]
发表于 2023-4-20 15:08:58 | 显示全部楼层 |阅读模式

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

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

x
这是一个有趣的古典数学问题:如果说兔子在出生两个月后,就有繁殖能力,在拥有繁殖能力之后,这对免了每个月能生出一对小兔子来,假设所有兔子都不会死去,能够一直千下去,那么两年之后可以繁殖多少对兔了呢?       
6a26175bc711abf2612f2470b63a460.png
e9ddc844c927d9db46cfaf1337bf36f.jpg
为什么我草稿纸演算结果不对呢?第六个月就开始不对了!求老师解答。
#include<stdio.h>

int main()
{
        int a = 1,b = 1;
        int temp,count;
        int n;
        for(n = 3;n < 25; n++)
        {
                count = a+b;
                a = b;
                b = count;
                
                printf("第%d月有%d对兔子\n",n,count); 
        } 
         


        return 0; 
}

答案是:
a235b4f38388868ee4522fe08b735df.png
最佳答案
2023-4-20 17:18:12
a905448839 发表于 2023-4-20 17:11
原来如此,如果遇到类似这种题,用c语言解题,用什么思路比较好呢?代码每一行的思路我还是不太理解,能 ...

这个问题可以使用递归或动态规划的方法来解决。这里我们采用动态规划的方法,利用数组存储每个月的大兔子和小兔子的数量。

1. 定义两个数组,一个用于存储每个月大兔子的数量(matureRabbits),另一个用于存储每个月小兔子的数量(youngRabbits)。

2. 初始化数组。初始时,第一个月有一对大兔子,没有小兔子。

3. 循环计算每个月的兔子数量。从第二个月开始计算,直到第24个月(两年)。

   a. 对于每个月,先计算大兔子的数量。当前月的大兔子数量等于上个月的大兔子数量加上上上个月的小兔子数量(因为它们已经长大了)。

   b. 接下来,计算小兔子的数量。当前月的小兔子数量等于上个月大兔子的数量(因为它们在这个月繁殖了)。

   c. 将计算得到的大兔子和小兔子数量分别存储在对应的数组中。

4. 最后,将第24个月的大兔子和小兔子数量相加,得到两年后的兔子总数。

以下是代码实现:
#include <stdio.h>

int main() {
    int matureRabbits[25];
    int youngRabbits[25];

    matureRabbits[1] = 1;
    youngRabbits[1] = 0;

    for (int month = 2; month <= 24; month++) {
        matureRabbits[month] = matureRabbits[month - 1] + (month > 2 ? youngRabbits[month - 2] : 0);
        youngRabbits[month] = matureRabbits[month - 1];

        printf("第%d月有%d对大兔子,%d对小兔子\n", month, matureRabbits[month], youngRabbits[month]);
    }

    int totalRabbits = matureRabbits[24] + youngRabbits[24];
    printf("两年后共有%d对兔子\n", totalRabbits);

    return 0;
}

这个代码实现会打印出每个月大兔子和小兔子的数量,以及最后两年后的兔子总数。希望这对你有所帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-20 15:19:26 | 显示全部楼层
150143yljmuckhvlqyjlad.jpg

这个小的还没长够两个月就大了,还生娃了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-20 15:28:34 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-20 15:19
这个小的还没长够两个月就大了,还生娃了

他是3月的小兔子呀,5月就长大了呀。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-20 15:30:11 | 显示全部楼层
本帖最后由 isdkz 于 2023-4-20 15:34 编辑
a905448839 发表于 2023-4-20 15:28
他是3月的小兔子呀,5月就长大了呀。。。


3月份的兔子长大的是右边那个,这个是三月份的兔子刚长大后生出来的

所以这个兔子往下还是小的,它才刚出生,不应该长大和生娃
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-20 16:51:53 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-20 15:30
3月份的兔子长大的是右边那个,这个是三月份的兔子刚长大后生出来的

所以这个兔子往下还是小的,它 ...

奥,那么下面的列表第6月是什么错误呢?
在第六月时大兔子=第五月大兔子 + 第四月的小兔子(长大了)
即便第六月大兔子=2+2=4对

在第六月时小兔子=本月大兔子生的小兔子(上面求得6月大兔子为4,所以6月生了4个小兔子) + 上个月5月的小兔子 – 4月长大的兔子
即便第六月的小兔子=4+3-2=5对


总共是9对  。。。

我是这样理解的!请问哪里出错了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-20 17:02:07 | 显示全部楼层
a905448839 发表于 2023-4-20 16:51
奥,那么下面的列表第6月是什么错误呢?
在第六月时大兔子=第五月大兔子 + 第四月的小兔子(长大了)
即 ...

在第六月时大兔子=第五月大兔子 + 第四月的小兔子(长大了)
即便第六月大兔子=2+2=4对


这个错了,第四月到第六月长大的小兔子只有一对,也就是第六月大兔子只有 2 + 1 = 3 对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-20 17:11:59 From FishC Mobile | 显示全部楼层
isdkz 发表于 2023-4-20 17:02
这个错了,第四月到第六月长大的小兔子只有一对,也就是第六月大兔子只有 2 + 1 = 3 对

原来如此,如果遇到类似这种题,用c语言解题,用什么思路比较好呢?代码每一行的思路我还是不太理解,能详细告知一下吗?谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-20 17:18:12 | 显示全部楼层    本楼为最佳答案   
a905448839 发表于 2023-4-20 17:11
原来如此,如果遇到类似这种题,用c语言解题,用什么思路比较好呢?代码每一行的思路我还是不太理解,能 ...

这个问题可以使用递归或动态规划的方法来解决。这里我们采用动态规划的方法,利用数组存储每个月的大兔子和小兔子的数量。

1. 定义两个数组,一个用于存储每个月大兔子的数量(matureRabbits),另一个用于存储每个月小兔子的数量(youngRabbits)。

2. 初始化数组。初始时,第一个月有一对大兔子,没有小兔子。

3. 循环计算每个月的兔子数量。从第二个月开始计算,直到第24个月(两年)。

   a. 对于每个月,先计算大兔子的数量。当前月的大兔子数量等于上个月的大兔子数量加上上上个月的小兔子数量(因为它们已经长大了)。

   b. 接下来,计算小兔子的数量。当前月的小兔子数量等于上个月大兔子的数量(因为它们在这个月繁殖了)。

   c. 将计算得到的大兔子和小兔子数量分别存储在对应的数组中。

4. 最后,将第24个月的大兔子和小兔子数量相加,得到两年后的兔子总数。

以下是代码实现:
#include <stdio.h>

int main() {
    int matureRabbits[25];
    int youngRabbits[25];

    matureRabbits[1] = 1;
    youngRabbits[1] = 0;

    for (int month = 2; month <= 24; month++) {
        matureRabbits[month] = matureRabbits[month - 1] + (month > 2 ? youngRabbits[month - 2] : 0);
        youngRabbits[month] = matureRabbits[month - 1];

        printf("第%d月有%d对大兔子,%d对小兔子\n", month, matureRabbits[month], youngRabbits[month]);
    }

    int totalRabbits = matureRabbits[24] + youngRabbits[24];
    printf("两年后共有%d对兔子\n", totalRabbits);

    return 0;
}

这个代码实现会打印出每个月大兔子和小兔子的数量,以及最后两年后的兔子总数。希望这对你有所帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-4-20 17:40:27 | 显示全部楼层
isdkz 发表于 2023-4-20 17:18
这个问题可以使用递归或动态规划的方法来解决。这里我们采用动态规划的方法,利用数组存储每个月的大兔子 ...
#include<stdio.h>

int main()
{
        int a = 1,b = 1;
        int temp,count;
        int n;
        for(n = 3;n < 25; n++)
        {
                count = a+b;
                a = b;
                b = count;
                
                printf("第%d月有%d对兔子\n",n,count); 
        } 
         


        return 0; 
}

这个代码是对的话 那么for循环里的三个语句怎么理解呢?能详细解释下吗?想了一下午没想懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-20 17:53:42 | 显示全部楼层
a905448839 发表于 2023-4-20 17:40
这个代码是对的话 那么for循环里的三个语句怎么理解呢?能详细解释下吗?想了一下午没想懂

这段代码实际上是计算斐波那契数列的一个简化版本,用于计算兔子问题。但需要注意的是,这段代码实际上计算的是每个月的总兔子数量,而不是大兔子和小兔子的数量。下面是对这段代码的解释:

1. 定义整数变量 `a` 和 `b`,它们将存储斐波那契数列的连续两项。初始值为 1 和 1,对应斐波那契数列的前两项。

2. 定义整数变量 `temp` 和 `count`。`temp` 在这段代码中实际上没有使用,可以忽略。`count` 用于存储斐波那契数列的下一项。

3. 使用 `for` 循环从第3个月开始迭代,直到第24个月(两年)。变量 `n` 表示当前月份。

   a. 计算斐波那契数列的下一项。`count = a + b`。这里 `a` 和 `b` 分别表示斐波那契数列的当前项和下一项。

   b. 更新斐波那契数列的当前项和下一项。`a` 的值变为 `b`,`b` 的值变为 `count`。这样,在下一次迭代中,`a` 和 `b` 将分别表示斐波那契数列的前两项。

   c. 打印当前月份的总兔子数量。这里的 `count` 实际上是斐波那契数列的当前项,即当前月份的总兔子数量。

这段代码的核心是计算斐波那契数列,并将其与兔子问题相联系。但请注意,这段代码并没有区分大兔子和小兔子的数量,而是计算的总兔子数量。要计算大兔子和小兔子的数量,您可以参考我之前提供的代码示例。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-20 22:20:42 | 显示全部楼层
isdkz 发表于 2023-4-20 17:18
这个问题可以使用递归或动态规划的方法来解决。这里我们采用动态规划的方法,利用数组存储每个月的大兔子 ...
#include<stdio.h>

int main()
{
        int min[25];
        int max[25];
        
        min[0] = 1;//小兔子第一月对数 
        min[1] = 1;//小兔子第二月对数 
        max[0] = 0;//大兔子第一月对数 
        max[1] = 0;//大兔子第二月对数 
        
        int n;
        for(n = 2;n < 25;n++)
        {
                max[n] = max[n-1] + min[n-2]; //大兔子等于前一月的大兔子加上前两月小兔子成长后的 
                min[n] = max[n]+ min[n-1];//小兔子等于本月所生的小兔子+上月未长大的小兔子 
                printf("第%d月大兔子%d对\n",n+1,max[n]); 
                printf("第%d月小兔子%d对\n\n",n+1,min[n]); 
        }
        printf("两年后总兔子:%d\n",min[n-1]+max[n-1]);
         


        return 0;
}

按照自己思路编写的代码 请问哪里有问题呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-21 09:24:11 | 显示全部楼层
学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 23:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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