鱼C论坛

 找回密码
 立即注册
查看: 1539|回复: 12

[已解决]昨天的题,三个代码哪个是对的呢?

[复制链接]
发表于 2023-4-21 21:01:51 | 显示全部楼层 |阅读模式

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

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

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

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




  1. #include<stdio.h>

  2. int main()
  3. {
  4.         int a = 1,b = 1;
  5.         int temp,count;
  6.         int n;
  7.         for(n = 3;n < 25; n++)
  8.         {
  9.                 count = a+b;
  10.                 a = b;
  11.                 b = count;
  12.                
  13.                 printf("第%d月有%d对兔子\n",n,count);
  14.         }
  15.          


  16.         return 0;
  17. }
复制代码


  1. #include <stdio.h>

  2. int main() {
  3.     int matureRabbits[25];
  4.     int youngRabbits[25];

  5.     matureRabbits[1] = 1;
  6.     youngRabbits[1] = 0;

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

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

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

  15.     return 0;
  16. }
复制代码

  1. #include<stdio.h>

  2. int main()
  3. {
  4. int min[25];
  5. int max[25];
  6. int z[25];
  7. min[0] = 1;//小兔子第一月对数
  8. min[1] = 1;//小兔子第二月对数
  9. max[0] = 0;//大兔子第一月对数
  10. max[1] = 0;//大兔子第二月对数


  11. int n;
  12. for(n = 2;n < 25;n++)
  13. {
  14.   max[n] = max[n-1] + min[n-2]; //大兔子等于前一月的大兔子加上前两月小兔子成长后的
  15.   min[n] = max[n]+ min[n-1];//小兔子等于本月所生的小兔子+上月未长大的小兔子
  16.   printf("第%d月大兔子%d对\n",n+1,max[n]);
  17.   printf("第%d月小兔子%d对\n\n",n+1,min[n]);
  18. }
  19. printf("两年后总兔子:%d\n",min[n-1]+max[n-1]);
  20.   


  21. return 0;
  22. }
复制代码
最佳答案
2023-4-21 21:05:16
三个代码都是可以得出答案的,但实现方式略有不同。
  • 第一个代码使用类似斐波那契数列的方式来计算兔子对数,可以输出每个月兔子对数的过程,但没有直接输出最终两年后兔子对数的语句。
  • 第二个代码使用了两个数组来分别存储小兔子和大兔子的数量,通过递推计算得出两年后兔子的总数,并输出了每个月兔子对数的过程。
  • 第三个代码同样使用了递推式来计算兔子对数,但只用了一个数组来存储兔子对数,最后输出了两年后兔子的总数。


因此,选择哪个代码可以根据实际需求和编程习惯而定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-21 21:05:16 | 显示全部楼层    本楼为最佳答案   
三个代码都是可以得出答案的,但实现方式略有不同。
  • 第一个代码使用类似斐波那契数列的方式来计算兔子对数,可以输出每个月兔子对数的过程,但没有直接输出最终两年后兔子对数的语句。
  • 第二个代码使用了两个数组来分别存储小兔子和大兔子的数量,通过递推计算得出两年后兔子的总数,并输出了每个月兔子对数的过程。
  • 第三个代码同样使用了递推式来计算兔子对数,但只用了一个数组来存储兔子对数,最后输出了两年后兔子的总数。


因此,选择哪个代码可以根据实际需求和编程习惯而定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-21 21:07:45 | 显示全部楼层
而且这种帖子应该发在C/C++板块

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-21 21:11:10 | 显示全部楼层
第三个代码段是正确的。这个问题描述的实际上是著名的斐波那契数列问题。这个代码通过追踪成熟兔子(能够繁殖的兔子)和小兔子(还不能繁殖的兔子)的数量来计算出两年后(24个月)的兔子对数。以下是正确的代码段:

  1. #include <stdio.h>

  2. int main() {
  3.     int matureRabbits[25];
  4.     int youngRabbits[25];

  5.     matureRabbits[1] = 1;
  6.     youngRabbits[1] = 0;

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

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

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

  15.     return 0;
  16. }
复制代码


这个代码会计算出每个月的成熟兔子和小兔子的数量,并在循环结束后计算两年后总的兔子对数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-21 21:22:59 | 显示全部楼层
歌者文明清理员 发表于 2023-4-21 21:07
而且这种帖子应该发在C/C++板块

我好像权限不够。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

第一段代码是本论坛的老师 小甲鱼课后题的答案代码 与你的代码答案不同 是该相信谁呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

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

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

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

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

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-22 00:18:55 | 显示全部楼层
本帖最后由 a905448839 于 2023-4-22 00:24 编辑
isdkz 发表于 2023-4-21 21:31
做参考就好,问gpt的,刚刚你的代码格式有点乱

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

  1. #include <stdio.h>

  2. int main() {
  3.     int matureRabbits[25];
  4.     int youngRabbits[25];

  5.     matureRabbits[1] = 1;
  6.     youngRabbits[1] = 0;

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

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

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

  15.     return 0;
  16. }
复制代码


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

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

youngRabbits[month] = matureRabbits[month]+youngRabbits[month-1] ;//所以这里我错了

我这样思考是否正确呢?

最后你能帮我改进一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-22 00:30:39 | 显示全部楼层
a905448839 发表于 2023-4-22 00:18
在昨天你给的这段代码中  
matureRabbits[1] = 1;
    youngRabbits[1] = 0;

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

  1. #include <stdio.h>

  2. int main() {
  3.     int matureRabbits[25];
  4.     int youngRabbits[25];

  5.     matureRabbits[1] = 0;
  6.     youngRabbits[1] = 1;

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

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

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

  15.     return 0;
  16. }
复制代码


这段代码应该能够正确计算两年后的兔子数量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-22 00:42:07 | 显示全部楼层
isdkz 发表于 2023-4-22 00:30
确实,你的观察是正确的。在第二个月,兔子对数应该是1对小兔子。此外,确实应该在考虑本月长大的大兔子 ...
  1.         youngRabbits[month] = matureRabbits[month - 1] + (month > 2 ? youngRabbits[month - 1] - youngRabbits[month - 2] : 0);
复制代码

这串代码不应该是
  1.         youngRabbits[month] = matureRabbits[month] + (month > 2 ? matureRabbits[month - 1] : 0);
复制代码

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

这样理解是否更准确呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-22 04:14:15 | 显示全部楼层
a905448839 发表于 2023-4-21 21:22
我好像权限不够。。

不要点“带你学C带你飞 第一季”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-22 09:51:15 | 显示全部楼层
这三个代码都是正确的,它们都是用不同的方式实现了同一个问题。它们都是根据斐波那契数列的规律来计算兔子数量的。

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

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

无论你选择哪个代码,都可以得到正确的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

重复一下题目
这是一个有趣的古典数学问题:如果说兔子在出生第三个月,就长大了,有繁殖能力,在拥有繁殖能力之后,这对免了每个月能生出一对小兔子来(包括长大的第三个月也会生小兔子),假设所有兔子都不会死去,能够一直千下去,那么两年之后可以繁殖多少对兔了呢?      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 04:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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