a905448839 发表于 2023-4-20 15:08:58

难题求解!

这是一个有趣的古典数学问题:如果说兔子在出生两个月后,就有繁殖能力,在拥有繁殖能力之后,这对免了每个月能生出一对小兔子来,假设所有兔子都不会死去,能够一直千下去,那么两年之后可以繁殖多少对兔了呢?       


为什么我草稿纸演算结果不对呢?第六个月就开始不对了!求老师解答。


#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;
}




答案是:

isdkz 发表于 2023-4-20 15:19:26



这个小的还没长够两个月就大了,还生娃了

a905448839 发表于 2023-4-20 15:28:34

isdkz 发表于 2023-4-20 15:19
这个小的还没长够两个月就大了,还生娃了

他是3月的小兔子呀,5月就长大了呀。。。

isdkz 发表于 2023-4-20 15:30:11

本帖最后由 isdkz 于 2023-4-20 15:34 编辑

a905448839 发表于 2023-4-20 15:28
他是3月的小兔子呀,5月就长大了呀。。。

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

所以这个兔子往下还是小的,它才刚出生,不应该长大和生娃

a905448839 发表于 2023-4-20 16:51:53

isdkz 发表于 2023-4-20 15:30
3月份的兔子长大的是右边那个,这个是三月份的兔子刚长大后生出来的

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

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

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


总共是9对。。。

我是这样理解的!请问哪里出错了呢?

isdkz 发表于 2023-4-20 17:02:07

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

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

这个错了,第四月到第六月长大的小兔子只有一对,也就是第六月大兔子只有 2 + 1 = 3 对

a905448839 发表于 2023-4-20 17:11:59

isdkz 发表于 2023-4-20 17:02
这个错了,第四月到第六月长大的小兔子只有一对,也就是第六月大兔子只有 2 + 1 = 3 对

原来如此,如果遇到类似这种题,用c语言解题,用什么思路比较好呢?代码每一行的思路我还是不太理解,能详细告知一下吗?谢谢你

isdkz 发表于 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;
    int youngRabbits;

    matureRabbits = 1;
    youngRabbits = 0;

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

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

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

    return 0;
}


这个代码实现会打印出每个月大兔子和小兔子的数量,以及最后两年后的兔子总数。希望这对你有所帮助!

a905448839 发表于 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循环里的三个语句怎么理解呢?能详细解释下吗?想了一下午没想懂{:5_107:}

isdkz 发表于 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` 实际上是斐波那契数列的当前项,即当前月份的总兔子数量。

这段代码的核心是计算斐波那契数列,并将其与兔子问题相联系。但请注意,这段代码并没有区分大兔子和小兔子的数量,而是计算的总兔子数量。要计算大兔子和小兔子的数量,您可以参考我之前提供的代码示例。

a905448839 发表于 2023-4-20 22:20:42

isdkz 发表于 2023-4-20 17:18
这个问题可以使用递归或动态规划的方法来解决。这里我们采用动态规划的方法,利用数组存储每个月的大兔子 ...

#include<stdio.h>

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


        return 0;
}


按照自己思路编写的代码 请问哪里有问题呢?

闲闲的又一天 发表于 2023-4-21 09:24:11

学习了
页: [1]
查看完整版本: 难题求解!