引言

韩信是中国历史上杰出的军事家之一,与萧何、张良一起被誉为汉初三杰。他的名言“韩信点兵,多多益善”说明了他精通兵法,善于用兵。

1.jpg

“韩信点兵”这个故事包含了一个非常著名的数学问题,被称作中国剩余定理或孙子定理。那么,这个问题有什么特别之处?又是如何快速计算人数的?

假设韩信率领1500人参加战斗,其中四五百人阵亡。在清点幸存者时,韩信命令士兵每3人一排,余2人;每5人一排,余3人;每7人一排,余2人。凭借这些信息,韩信立即算出了部队的人数。你能算出这支部队战后有多少人吗?

学习目标

[编程实现]:使用Scratch编程计算韩信的部队人数。

[知识与技能]

  1. 熟练使用变量,包括创建变量和赋值
  2. 熟悉列表的写入和读取
  3. 掌握分类积木中的取余运算积木

[过程与方法]:通过小组讨论交流合作,培养解决问题的能力。

[情感与价值观]:培养对信息技术的兴趣,培养想象力和逻辑思维能力。

分析过程

通过题目的描述,这里涉及到余数的概念,那么什么是余数呢?

我们先来看一个大家熟悉的场景–教室排座位,如图:

图2

教室里排座位

规定每一排坐两个人,如果班级人数是偶数(双数),那么学生刚好成对坐在一起,如果班级人数是(奇数)单数,那么就会有一个同学落单了。

我们使用数学语言来描述一下,如果班级人数是偶数,能被2整除,余数为0,刚好成对。如果班级人数是奇数,不能被2整除,余数为1,就必定有一个同学落单了。

所谓,余数指整数除法中被除数未被除尽部分,如果余数为0,说明刚好能整除。我们再来看一个生活中的场景:

3.png

在大部分语言中,用“%”来表示取余运算。a% b表示a除以b所得的余数,也叫做a对b取余;比如,100 % 3结果为1, 14 % 3结果为2,在Scratch编程中,专门提供了一个取余运算指令,如图:

图4

取余指令

在我们的韩信点兵问题中,如果士兵每3人站一排,多出2人,每5人站一排,多出3人,每7人站一排,多出2人,这都是求余数运算。根据这3个条件还是不能直接计算出总人数,不过我们可以使用枚举法,战前是1500人,战死四五百人,那么战后的人数在1000~1100之间,因此,我们完全可以从1000开始,挨个的进行计算,直到1100为止,看有没有满足条件的数字。

我们将整个过程使用流程图表示如下:

图5

韩信点兵程序流程图

程序设计

1.建立变量和列表

分别建立变量“人数”和列表“解”,如图:

图6

建立变量和列表

2.初始化变量和列表

根据前面的分析,我们从1000开始枚举,所以需要把变量“人数”的初始值设为1000,而列表需要清空,编写代码如下:

图7

变量和列表初始化

3.使用循环实现枚举

根据前面的分析,人数在1000到1100之间,这可以借助循环来进行枚举,如图所示:

图8

循环遍历操作

4.筛选值

如果同时满足被3除余2、被5除余3、被7除余2这三个条件,就将整个数字放到列表中,对应的代码如下:

图9

筛选满足条件的数字

完整的代码如下:

图10

韩信点兵完整代码

执行代码,结果如下所示:

图11

韩信点兵执行结果

从执行结果可以看出,韩信的部队人数是1073。

课堂反思

让学生编程程序,并填写程序测试单,如图所示:

图12

提问,让学生进行小组讨论,然后回答问题:

  • 第1个问题:什么是枚举法?
  • 第2个问题:什么是余数?
  • 第3个问题:描述下韩信是怎么计算士兵数量的?

延续拓展

请设计一个程序,让用户在键盘上输入今天的星期数和今后的天数,就可以计算出那一天的星期数。

图13

日历

[提示]:让我们先来想一想,假设今天是星期天,我们怎么推算一天后,两天后……六天后是星期几?

课后练习

舞蹈队有24个同学跳孔雀舞。

图14

舞蹈队

  1. 如果排成5行,平均每行几个同学,还余几个?
  2. 如果排成7行,平均每行几个同学,还余几个?
  3. 你能设计出几个排队方案,把同学正好排完(没有余数) ?

标签: Scratch, Scratch编程, Scratch中国, 少儿编程, Scratch社区, Scratch编程社区, Scratch编程课程, Scratch编程教程