a905448839 发表于 2023-4-21 21:01:51

昨天的题,三个代码哪个是对的呢?

本帖最后由 a905448839 于 2023-4-21 21:05 编辑

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




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


#include <stdio.h>

int main() {
    int matureRabbits;
    int youngRabbits;

    matureRabbits = 1;
    youngRabbits = 0;

int month;
    for (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;
}

#include<stdio.h>

int main()
{
int min;
int max;
int z;
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 21:05:16

三个代码都是可以得出答案的,但实现方式略有不同。

[*]第一个代码使用类似斐波那契数列的方式来计算兔子对数,可以输出每个月兔子对数的过程,但没有直接输出最终两年后兔子对数的语句。

[*]第二个代码使用了两个数组来分别存储小兔子和大兔子的数量,通过递推计算得出两年后兔子的总数,并输出了每个月兔子对数的过程。

[*]第三个代码同样使用了递推式来计算兔子对数,但只用了一个数组来存储兔子对数,最后输出了两年后兔子的总数。


因此,选择哪个代码可以根据实际需求和编程习惯而定。

歌者文明清理员 发表于 2023-4-21 21:07:45

而且这种帖子应该发在C/C++板块
https://t1.wodetu.cn/2023/04/21/74e21bd2bf48e18da9593edebcc4bbee.png

isdkz 发表于 2023-4-21 21:11:10

第三个代码段是正确的。这个问题描述的实际上是著名的斐波那契数列问题。这个代码通过追踪成熟兔子(能够繁殖的兔子)和小兔子(还不能繁殖的兔子)的数量来计算出两年后(24个月)的兔子对数。以下是正确的代码段:

#include <stdio.h>

int main() {
    int matureRabbits;
    int youngRabbits;

    matureRabbits = 1;
    youngRabbits = 0;

    int month;
    for (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-21 21:22:59

歌者文明清理员 发表于 2023-4-21 21:07
而且这种帖子应该发在C/C++板块

我好像权限不够。。

a905448839 发表于 2023-4-21 21:23:54

isdkz 发表于 2023-4-21 21:11
第三个代码段是正确的。这个问题描述的实际上是著名的斐波那契数列问题。这个代码通过追踪成熟兔子(能够繁 ...

第一段代码是本论坛的老师 小甲鱼课后题的答案代码 与你的代码答案不同 是该相信谁呢?

isdkz 发表于 2023-4-21 21:31:22

a905448839 发表于 2023-4-21 21:23
第一段代码是本论坛的老师 小甲鱼课后题的答案代码 与你的代码答案不同 是该相信谁呢?

做参考就好,问gpt的,刚刚你的代码格式有点乱

现在我又问了一遍是这样的:

从这三个代码中,第二个代码和第三个代码都能正确解决这个问题。但在解释它们之前,让我们先理解这个问题的基本概念。

这是一个经典的斐波那契数列问题,其中每个月的兔子对数是前两个月兔子对数的和。为了解决这个问题,我们需要知道每个月成年兔子(已经可以繁殖)和小兔子(还不能繁殖)的数量。

第一个代码直接计算斐波那契数列,没有考虑大兔子和小兔子的区别。因此,它不能准确地解决这个问题。

第二个代码和第三个代码都使用了类似的方法来解决问题。它们使用数组存储每个月成年兔子和小兔子的数量,然后迭代更新这两个数量。

第二个代码:
- 使用数组 matureRabbits 和 youngRabbits 分别存储成年兔子和小兔子的数量。
- 使用循环计算每个月成年兔子和小兔子的数量,注意在计算过程中需要满足时间限制。
- 在循环结束后,输出两年(24个月)后成年兔子和小兔子的总数量。

第三个代码:
- 使用数组 max 和 min 分别存储成年兔子和小兔子的数量。
- 使用循环计算每个月成年兔子和小兔子的数量,注意在计算过程中需要满足时间限制。
- 在循环结束后,输出两年(24个月)后成年兔子和小兔子的总数量。

因此,第二个和第三个代码都可以正确解决这个问题。根据你对代码的可读性和易用性的偏好,你可以选择其中任意一个。

a905448839 发表于 2023-4-22 00:18:55

本帖最后由 a905448839 于 2023-4-22 00:24 编辑

isdkz 发表于 2023-4-21 21:31
做参考就好,问gpt的,刚刚你的代码格式有点乱

现在我又问了一遍是这样的:


#include <stdio.h>

int main() {
    int matureRabbits;
    int youngRabbits;

    matureRabbits = 1;
    youngRabbits = 0;

    int month;
    for (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;
}


在昨天你给的这段代码中
matureRabbits = 1;
    youngRabbits = 0;
赋值出现的问题 首先最开始的两个月都是1对小兔子 即
matureRabbits = 0;
    youngRabbits = 1;
然后这句youngRabbits = matureRabbits; 小兔子应该是等于本月的大兔子所生的小兔子(包括本月长大的大兔子 在题目中应该是长大就生小兔子吧?本月长大即便就是第三个月 也生了小兔子 不应是上一个月的大兔子所生的小兔子)+ 上个月未长大的小兔子(即是2个月大的小兔子 他没有长大 属于小兔子)

//这里我的思路出现问题了 。上个月未长大的小兔子 其中有部分应该是上上个月的小兔子(他在本月就会长大了)这里面有个变量应该是上个月大兔子生的小兔子才不会在本月长大

youngRabbits = matureRabbits+youngRabbits ;//所以这里我错了

我这样思考是否正确呢?

最后你能帮我改进一下吗?

isdkz 发表于 2023-4-22 00:30:39

a905448839 发表于 2023-4-22 00:18
在昨天你给的这段代码中
matureRabbits = 1;
    youngRabbits = 0;


确实,你的观察是正确的。在第二个月,兔子对数应该是1对小兔子。此外,确实应该在考虑本月长大的大兔子繁殖能力。根据这些考虑,我对代码进行了修改:

#include <stdio.h>

int main() {
    int matureRabbits;
    int youngRabbits;

    matureRabbits = 0;
    youngRabbits = 1;

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

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

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

    return 0;
}


这段代码应该能够正确计算两年后的兔子数量。

a905448839 发表于 2023-4-22 00:42:07

isdkz 发表于 2023-4-22 00:30
确实,你的观察是正确的。在第二个月,兔子对数应该是1对小兔子。此外,确实应该在考虑本月长大的大兔子 ...

      youngRabbits = matureRabbits + (month > 2 ? youngRabbits - youngRabbits : 0);

这串代码不应该是      youngRabbits = matureRabbits + (month > 2 ? matureRabbits : 0);

本月小兔子应该 = 本月大兔子所生的小兔子而不是上月大兔子所生的小兔子(因为本月刚长大的大兔子已经长大了长大就是第三个月了 开始生兔子 按照你的逻辑 那就是等到第四月才生小兔子 不能去等到第四个月再生 所以这里的小兔子就等于本月的大兔子)+上个月大兔子所生的小兔子(上个月大兔子生的小兔子还在第二个月 未长大 即便又+上个月的大兔子就行)

这样理解是否更准确呢?

歌者文明清理员 发表于 2023-4-22 04:14:15

a905448839 发表于 2023-4-21 21:22
我好像权限不够。。

不要点“带你学C带你飞 第一季”

陶远航 发表于 2023-4-22 09:51:15

这三个代码都是正确的,它们都是用不同的方式实现了同一个问题。它们都是根据斐波那契数列的规律来计算兔子数量的。

在这三个代码中,第二个代码可能更易于理解,因为它使用了两个数组来分别存储成熟兔子和幼兔子的数量,并且在每个月的循环中更新这两个数组。最终,它计算出两年后总共有多少对兔子,并输出结果。

第一个代码和第三个代码都是使用两个变量来存储成熟兔子和幼兔子的数量,并且在每个月的循环中更新这两个变量。它们也可以计算出两年后总共有多少对兔子,并输出结果。

无论你选择哪个代码,都可以得到正确的结果。

a905448839 发表于 2023-4-22 10:29:55

陶远航 发表于 2023-4-22 09:51
这三个代码都是正确的,它们都是用不同的方式实现了同一个问题。它们都是根据斐波那契数列的规律来计算兔子 ...

后两个代码是不正确的
我们拿第二个举例
在for循环里
matureRabbits = matureRabbits + (month > 2 ? youngRabbits : 0);
这里大兔子等于上一个月大兔子加上前两个月小兔子(这里认为前两个小兔子在本月长大 实际上前两个月小兔子其中有部分在上个月就长大了)
youngRabbits = matureRabbits;
这里小兔子等于上个月的大兔子生的小兔子 + 上月出生的小兔子(实际上是本月大兔子所生的兔子兔子是第三个月才长大长大就生孩子 所以本月的所生的小兔子 等于 本月的大兔子 还得+上月出生的小兔子 因为他们在这个月未长大)

重复一下题目
这是一个有趣的古典数学问题:如果说兔子在出生第三个月,就长大了,有繁殖能力,在拥有繁殖能力之后,这对免了每个月能生出一对小兔子来(包括长大的第三个月也会生小兔子),假设所有兔子都不会死去,能够一直千下去,那么两年之后可以繁殖多少对兔了呢?      
页: [1]
查看完整版本: 昨天的题,三个代码哪个是对的呢?