单元六 · 快速遍历数据

第21课 鸡兔同笼巧计算

任务场景
任务场景:鸡兔同笼巧计算

一、学习目标

  • 了解鸡兔同笼问题的求解方法,能通过表格列出数量的变化,发现其中的规律。
  • 感受遍历法的应用,能看懂鸡兔同笼问题的算法流程图,了解算法与程序的对应关系。

二、情境导入

我国古代典籍《孙子算经》中记载了许多有趣的问题,其中就有「鸡兔同笼」问题。书中是这样描述的:「今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?」意思是:有若干只鸡和兔关在同一个笼子里,从上面数有 35 个头,从下面数有 94 只脚,鸡和兔各有多少只?

想一想:你能用学过的方法算出答案吗?如果让计算机来求解,又该设计怎样的算法?

三、核心讲解

本课学习路径:

1用数学算式求解鸡兔同笼问题
2用枚举法求解鸡兔同笼问题
3编程验证鸡兔同笼问题

1.用数学算式求解鸡兔同笼问题

为了便于理解,我们先把原问题的数量减少为:今有鸡兔同笼,上有 6 头,下有 18 足,问鸡兔各几何?

方法 1:假设 6 只全部是兔。如果全部是兔,那么 6 只兔一共有 24 只脚,实际上只有 18 只脚,于是需要减少 6 只脚,即 24 − 18 = 6。这样,自然就是 3 只兔和 3 只鸡。

解法分析:鸡:(6×4 − 18)÷ 2 = 3(只);兔:6 − 3 = 3(只)。

方法 2:假设 6 只全部是鸡。如果全部是鸡,那么一共有 6×2 = 12 只脚,实际上有 18 只脚,于是少了 6 只脚,即 18 − 12 = 6。需要把 6 只脚添加上,自然就是 3 只兔和 3 只鸡。

解法分析:兔:(18 − 6×2)÷ 2 = 3(只);鸡:6 − 3 = 3(只)。

还原到原题「上有三十五头,下有九十四足」:假设全部是兔,鸡:(35×4 − 94)÷ 2 = 23(只),兔:35 − 23 = 12(只)。方法总结:鸡的数量 =(总头数×4 − 总脚数)÷ 2。

2.用枚举法求解鸡兔同笼问题

枚举法是将问题的所有可能逐个列举,在列举过程中遍历每个数据是否是正确答案。

流程图:鸡兔同笼枚举遍历

开始输入头数 H、脚数 F枚举鸡的只数 c = 0…H兔 = H−c,检验脚数输出符合条件的鸡兔数结束
  1. 先假设 35 只都是鸡,算出脚的数量。
  2. 如果数量不符合,则减一只鸡、增加一只兔,再计算脚的数量。
  3. 如此循环遍历,直到找到正确的鸡和兔数量,即 23 只鸡和 12 只兔。

鸡的数量变化:35、34、33……23;兔的数量变化:0、1、2……12;脚的数量变化:70、72、74……94。

算法描述:第 1 步,初始化鸡的数量 a = 35 和兔的数量 b = 0;第 2 步,计算脚的数量 c = a×2 + b×4;第 3 步,把脚的数量与 94 进行比较——如果不相等,将鸡的数量减 1、兔的数量加 1,并回到第 2 步继续循环;如果相等,则输出当前鸡和兔的数量,结束循环。

想一想:如果先假设 35 只都是兔,用枚举法遍历求解时,应该对算法进行哪些调整?

3.编程验证鸡兔同笼问题

要编程解决鸡兔同笼问题,较简单的方法是利用循环结构对鸡和兔的数量逐个遍历,即先假设兔的数量为 0,通过不断增加兔的数量和减少鸡的数量,来逐步逼近正确答案。

方法分析:用枚举法求解问题时,每一步都简单而且相似;计算机不怕重复、单调,而且它的计算速度非常快。

参考程序思路:

  1. 设置鸡数量的初始值 a = 35,兔数量的初始值 b = 0。
  2. 用循环结构计算 c = a×2 + b×4,比较 c 是否等于 94。
  3. 若相等则输出结果并结束;否则 a 减 1、b 加 1,继续循环。

计算机解题的过程与人解题过程存在很多差异。我们用计算机解决问题时,要充分考虑计算机的运算特点。

本课无新基础语法;枚举算法见流程图。while / if 已学过。

弄清以上要点后,再进入下方 Python Online,用枚举法验证鸡兔同笼问题。

四、动手体验 · Python 3 Online 编程

五年级 · 鸡兔同笼:枚举验证。

五、课堂总结

  • 解决一个计算问题时,可以用自己学过的数学方法来求解,也可以依据运算规则设计算法来让计算机求解。
  • 枚举法是将问题的所有可能都逐个进行列举;在列举的过程中,遍历每个数据是否是问题的正确答案。
  • 如果是,则问题解决完成;如果不是,则继续列举,直到所有可能都被查看。

六、拓展提升

  • 韩信是我国历史上很有领兵能力的一名将领。有一次,汉军统帅韩信带 1 500 名勇士与楚军交战,战死四五百人。为了再战,韩信快速清点了人数:3 人一排站队多出 2 人;5 人一排多出 4 人;7 人一排多出 6 人。韩信马上宣布,我军有 1 049 名勇士。在知道了这三次布阵的结果后,韩信是如何算出来的?如何设计算法让计算机来找出这个数?
  • 《孙子算经》中还有一题:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?尝试描述求解这个问题的算法,找到 100 至 1 000 之间符合条件的物品数量。

测评

选出后点「检查」。答错会显示简短说明。

  1. 关于枚举法求解鸡兔同笼问题,下列说法正确的是?

  2. 今有鸡兔同笼,上有 35 头,下有 94 足。假设全部是兔,鸡有多少只?

  3. 用计算机求解鸡兔同笼问题时,为什么要优先考虑枚举法?

本节小结

鸡兔同笼既可用假设法列算式求解,也可用枚举法逐个检验;枚举法适合交给计算机快速遍历。弄清输入(头数、脚数)、处理(逐一枚举)、输出(鸡兔数量),是设计算法的关键。