用Scratch来解决奥数问题之“韩信点兵”(基础篇)

从今天起,我们将每隔一段时间安排一次用Scratch来解决奥数问题的栏目。在这个栏目里,我们将通过Scratch编程来帮助我们理解奥数问题中的核心所在——解题逻辑。

  下面,我们先来看看题目。

  题目出自我国古代一道流传于民间的趣味算术题——“韩信点兵”。大致的故事是,楚汉争霸,韩信率领了1500名将士和敌人交战。大战过后,虽然汉军获胜,但死伤也有近五百人,剩下的大概刚有一千人出头,回营之后,韩信想要清点一下剩余的将士。

  只见韩信命令士兵3人站一排,最后一排多出2人;5人站一排,最后一排多出3人;命令士兵7人一排,最后多出2人。

  紧接着,韩信向将士们宣布了剩余的汉军人数是1073人。大家都觉得韩信点兵如此绝妙,纷纷觉得韩信是“神仙下凡”、“神机妙算”。

  下面,各位同学们,你们能像韩信一样“神机妙算”吗?

  我们先用数学的方法来试着解答一下。

  不过首先,我们先把题目的重点重新归纳一下,然后把题目换个说法。
  一个数字除以3余2,除以5余3,除以7余2,请找到满足上述要求的,大于1000的最小的数。

  首先,我们要明白这类题目所考核的知识点是公倍数的概念,要同时满足三个要求,意味着我们要在调整其中某一个条件的时候不能影响另外两个条件,所以我们根据第一个条件“除以3余2”,找到5和7的公倍数中满足此条件的,很容易,我们发现5×7=35,35÷3=11……2,35正是满足这个要求的数字;再来看第二个条件“除以5余3”,我们同样找到3和7的公倍数中满足此条件的,这也很容易3×7=21,21÷5=4……1,于是我们能得到,21×3=63,63÷5=12……3,63就是满足第二个条件的数字;同理,我们按照第三个条件,用相同的方法,可以得到30÷7=4……2,30是满足第三个条件的数字。
  我们把三个结果相加,发现35+63+30=128,这个结果除以3余2,除以5余3,除以7余2,正好满足了题目前半部分的要求,但它并不是大于1000的。究竟如何找到满足题目后半部分要求的答案呢?显然,我们要在目前已经得出的结果上加上一个数字,但加多少合适呢?我们需要加上一个不会影响当前余数变化的数字,也就是要加上一个能同时被3、5、7同时整除的数字,这难不倒我们,3、5、7的最小公倍数是3×5×7=105,我们用之前的结果128反复加上多次105,最终便会得到我们所要的结果。(如下表)

加上最小公倍数105的次数最终结果
1233
2338
3443
4548
5653
6758
7863
8968
91073

这样,我们得到了正确的答案,1073。

如何用数学的方法来解答这道题目说完了,不免有些繁琐复杂,下面我们用编程的方法来试着解答一下。

  我们先来看一下这位同学是如何解答的。

  我们来看这位同学的答案。
  在这段代码里,这位同学在程序开始时,首先对他所用到的变量和列表进行了初始化,这样确保每次启动程序时,变量和列表都是处于“空”的状态,之后使用了循环、判断来重复的对“兵士数量”进行判断,看是否满足题目的要求,当满足题目要求时将答案存储到一个列表中,并在最后全部计算完毕后显示这个列表。

  之后的讨论,有同学指出了代码中可以改进的地方:我们需要的答案是超过1000的最小的那个“兵士数量”,也就是大于1000的第一个答案,那么没有必要设置一个列表来记录那么多的答案,我们只需要从1000开始找,找到的第一个答案就是最终的答案了。
  对于这点,我们通过讨论获得大家一致赞同,之后我们修改了部分代码。

  对于本次的题目而言,这样的答案可以说非常完美的找到了题目的答案,但编程的乐趣就是不断的升级,对于目前的答案其实还有很多地方能够继续深挖,在保证运算结果的前提下提升代码在运算时的效率,具体该怎么做,我们会在后续的“深入篇”中继续讲解。

  好了,这次带来的趣味小编程就到这里了,大家有任何的想法可加我的微信(下方二维码)、微博@亿万星辰桃桃爸,跟我一同讨论少儿编程,进入编程这五彩斑斓的世界,我们下期再见。

About 5iCoding 20 Articles
编程不难,在如何学习编程! 来我爱编程网找刘老师。

Be the first to comment

Leave a Reply

Your email address will not be published.


*