Scratch进阶教程:韩信点兵

2018-01-24T07:28:32.000Z|27202

秦朝末年,楚汉争霸。相传有一次,韩信率领1500名将士与楚王大将李锋交战。苦战一场,楚军不敌,败退回营。而汉军也死伤约四五百人,于是韩信整顿兵马也返回大本营。当汉军走到一个山坡时,收到战报,说有楚军骑兵追来。韩信驰上高坡观看,只见远方尘土飞扬,敌军来势汹汹。汉军大战之后十分疲惫,此时敌兵袭来,不免人心惶惶。韩信仔细地观看敌方,发现来敌不足五百骑,便急速点兵迎敌。只见韩信命令士兵3人站成一排,多出2名;接着命令士兵5人一排,多出3名;再命令士兵7人一排,多出2名。就这样,一会儿功夫就点兵完毕,韩信马上向将士们宣布了汉军的人数。


韩信一向用兵如神,此时点兵更是绝妙,将士们都觉得韩信是“神仙下凡”、“神机妙算”。韩信又对将士们说:敌人不足五百,我们居高临下,以众击少,一定能打败敌人。于是将士们士气大振,顺势而下,向楚军发起攻击。一时间旌旗摇动,鼓声震天,汉军所向披靡,楚军乱作一团。交战不久,楚军大败而逃。


根据故事中给出的条件,你知道韩信算出汉军有多少名将士吗?


根据题意,韩信的汉军1500将士死伤四五百人,也就是还有1000人左右。因此我们用枚举法从1500人开始逐一减少,并判断列举的人数是否符合列队的情况,直到人数小于1000为止。


下面是这个算法的流程图:



根据上面介绍的算法,我们来编写程序。首先,创建一个变量叫做“兵数”,并将初值设为1500



并用“重复执行直到……”指令构建一个循环结构,用于列举各种可能方案



接着,对列举的各种方案,要逐一判断是否符合列队情况。韩信命令士兵列队,3人一排,多出2名;5人一排,多出3名;7人一排,多出2名。可以用如下指令表示:



以上三个条件是并列关系,我们把放入下面的“如果……那么”指令的条件中



完整的判断指令就是:



由于有几个条件表达式,使得脚本排列太宽,在Scratch的脚本区不利于排版。我们可以换成下面等价的结构,这样方便排版



如果找到符合以上条件的情况,则将其插入“日志”列表中


最后,解决这道“韩信点兵”问题的完整程序如下:



点击绿旗运行程序,得到如下5个解:



根据题意,韩信的汉军1500名将士在大战之后死伤约四五百人,那么在韩信点兵时,最接近的答案是,这支部队可能有1073人。


据说“韩信点兵”问题来源于中国古代数学著作《孙子算经》中的“物不知数”问题。《孙子算经》卷下第二十六题:“今有物,不知其数,三三数之,剩二,五五数之,剩三,七七数之,剩二,问物几何?” 这就是有名的“中国剩余定理”,或称“孙子定理”,它和韩信点兵是一个道理。


下面我们出一道同类型的题目:


一筐苹果,如果按5个一堆放,最后多出3个;如果按6个一堆放,最后多出4个;如果按7个一堆放,还多出1个。问这筐苹果至少有多少个?


请你试一试,用Scratch编写程序求解这道题。


© 著作权归作者所有,未经许可,禁止转载
返回标签前往论坛 © 著作权归作者所有。未经许可,不得转载。
发送
文章评论
写评论
0条 共 0页 到
GO

已经到底了哦~

加载更多评论

提示

©2017-2018-厦门纯游互动科技有限公司版权所有