![612bde5f77d5f929ed969de1be4d0195.png](https://i-blog.csdnimg.cn/blog_migrate/91a40dc4a9f5aa650ff1e5ec71a525ac.jpeg)
自己工作用Python,也想找机会让自己儿子入门下编程。在陪娃鸡了一段时间奥数后,我觉得Python可以用来解一些小学生奥数题,在儿子身上实践后发现挺适合小学生的理解能力,打算写几篇文章无私分享下,如果对其他小朋友有一点点用也是非常高兴了。
那为什么要跟高思五星题过不去?从小数学棒棒的我都觉得高思五星太难,正常的小朋友靠脑力是做不来的,所以就作为目标让计算机来攻克吧。
准备
推荐Jupyter Notebook,不清楚如何安装的自行百度,也可以使用Python3.6自带的IDE开发。随便找一本python书,就入门而言随便什么教材都是OK的。先看完前几章即可,不用去看复杂的图形和多媒体操作等章节。
那什么题目适合编程实现?首先要让孩子知道电脑的优势是死算,可以化繁为简地解决问题。也有部分题目需要先运用数学知识先行一步,再发挥电脑的运算优势。不管是哪一类题目,我挑选题目的原则是十行代码搞定,不让冗长的步骤使小朋友感到恐惧。每题学会一个新的知识点,循序渐进。
适合谁?有奥数基础,对编程感兴趣的孩子
【五年级高思第10讲超越篇第7题】a,b,c是三个互不相同的自然数,且满足abc X bca=7bc X cba,求三位数abc
书后的解题步骤需要了解同模之类的知识才能读懂,对我家这样没有经过几奥洗礼的小学生来说是太难了,但这样的题目交给计算机是不难的。只要设a,b,c三个变量,让他们循环组合成不同的组合,然后用if语句验证是否满足题目的等式即可。小朋友在学过if和for语法后即可自行完成,非常有成就感的。
for a in range(1,10):
for b in range(1,10):
for c in range(1,10):
if a!=b and a!=c and b!=c:
if(a*100+b*10+c)*(b*100+c*10+a)==(700+b*10+c)*(c*100+b*10+a):
print(a,b,c)
答案是:495
对于熟悉Python的读者一定会说这样的写法还不够完美,对小朋友来说能写到这个程度已经达到要求了。
【知识点】for循环,if判断,嵌套
【五年级高思第10讲超越篇第8题】已知算式abc x bca x cab = 234235286,其中a>b>c,后来发现右边的乘积的数字顺序出现错误,但是知道个位数的6是正确的,那么原式中的abc是多少?
我也是看了答案才知道怎么解,要求一个小学生拥有这么清晰的思路,实在太为难孩子了。和上一题方法完全一致,但更进一步的地方是需要自己再创造两个条件。虽说顺序发生错误,但不管怎么排序也就那么些数字,这个数不会小于200000000,也不会大于900000000。另外需要学会的新语法是求余数的“%”。
for a in range(1,10):
for b in range(1,10):
for c in range(1,10):
if a>b and b>c and (a*b*c-6)%10==0
and (a*100+b*10+c)*(b*100+c*10+a)*(c*100+a*10+b)>200000000
and (a*100+b*10+c)*(b*100+c*10+a)*(c*100+a*10+b)<900000000:
print(a,b,c,(a*100+b*10+c)*(b*100+c*10+a)*(c*100+a*10+b))
程序会打印出以下答案,肉眼看下就知道第三个是本题的答案
8 7 6 462191616
9 6 4 310315456
9 8 3 328245326
【知识点】求余数,隐藏条件解读
【五年级高思第10讲兴趣篇第4题】如图4个小三角形的顶点处有6个小圆圈,在这些圆圈中分别填上6个质数(可以重复),使得他们的和是20,而且每个小三角形3个顶点上的数之和相等,请问:这6个质数的乘积是多少?
![066a8c445f9ae30d30bfcd14ffa93c53.png](https://i-blog.csdnimg.cn/blog_migrate/09607ad75aea39034cf69429641da039.jpeg)
这道题不是5星题,但适合介绍新的编程知识点“List”。前面的题目中的循环比较简单,这里的循环对象是“质数”,所以需要人为创造一个“List”作为循环取数的“池子”。“List”是非常重要的概念,在实际工作中还会使用到多维的dataframe,因此先把一维的List掌握好是非常重要的。以下是小朋友写的:
hi=[2,3,5,7,11,13]
for a1 in hi:
for a2 in hi:
for a3 in hi:
for a4 in hi:
for a5 in hi:
for a6 in hi:
if a1+a2+a3+a4+a5+a6==20 and a1+a2+a3==a2+a4+a5 and
a2+a4+a5==a2+a3+a5 and a2+a3+a5==a3+a5+a6:
print(a1*a2*a3*a4*a5*a6)
答案是900,是对的,但不够好。在我们熟悉了for循环的使用方法后,如果遇到这类嵌套多层的for循环时,其实有更简洁的编码方式,再者要有好的编写习惯,比如可以用mylist去定义质数的数列,而不是用hi,另外每个小三角形要先计算好,以后遇到更复杂的编码时可以方便的重用这些计算结果。参考代码如下:
mylist = [2,3,5,7,11,13,17]
for i1,i2,i3,i4,i5,i6 in ((x1,x2,x3,x4,x5,x6) for x1 in mylist for x2 in mylist for x3 in mylist for x4 in mylist for x5 in mylist for x6 in mylist):
triangle_1 = i1 + i2 + i3
triangle_2 = i2 + i4 + i5
triangle_3 = i2 + i3 + i5
triangle_4 = i3 + i5 + i6
total = i1 + i2 + i3 + i4 + i5 + i6
if total == 20 and triangle_1 == triangle_2 and triangle_1 == triangle_3 and triangle_1 == triangle_4:
print(i1,i2,i3,i4,i5,i6,' ',i1*i2*i3*i4*i5*i6)
【知识点】List对象,高级for循环方法
这三题不难,儿子和他的一位小伙伴都可以很顺利的完成,让我感觉到写程序其实对小朋友也不是一件遥不可及的事情。也不需要用那些图形化的所谓儿童编程来做过渡。如果学业压力不大可以天天练习的话,估计一年下来就可以学成上班了,哈哈,想多了,好久不写东西了,今天先写到这里吧。