王德贵
勾股定理是大家熟知的,勾股数,就是构成勾股定理的三个数,即一个数的平方是另外两个数的平方和。比如,32+42=52,那么3、4、5就是勾股数。那么在一定范围内,有多少勾股数呢?我们在Scratch、Python和Applnventor_种环境中编程解答这一问题,并着重关注程序在不同环境中的运行效率。
本例可以考虑3个数,都从1开始用枚举法来解决问题,但这种方法循环次数最多,100以内的勾股数就需要计算1003=106,100万次!根据测算Scratch中运行要至少3分钟,Python运行不到1分钟,Applnventor运行大约需要1分钟,可见,它们各自运行的速度是不一样的。当然这主要是由程序语言决定的,Python运行最快,Scratch最慢。
那么怎样能够减少运算量呢?新的思路是根据天系式a2+b2=C2可知,先确定c的值,那么a和b的值一定小于c,所以循环到等于即可,这样就不用循环到最大值,从而减少运行时间。
我们把满足勾股定理的3个数,加入链表,然后显示出来,这个比较好理解。但运行后发现,有重复的项(比如3、4、5和4、3、5),共104项实际应为52项,说明恰好重复2次,那有办法去除重复的项目吗?
我們把每个c值加入链表,然后在下次得到满足条件的值时,就查询一下,这几个值在不在链表里:在,就是重复,不加入链表:不在链表里,那就加入进来!这样就不会有重复的数据了。
这段代码的作用就是去重。如果a.b都包含在链表里,就说明是重复数据,所以就做下标记0:如果a.b都不包含在链表里,就说明没有重复数据,于是就将数据加入链表f去重后,显示正常为52个。程序测算通过。
Python程序的思路和Scratch编程类似,基本程序如下,但依然有重复的数据。
所以仍然需要去重,在Python中,去重最简单的当数集合!这个和高中数学知识基本一样的,其特点有二=:“确定性:对于任意一个元素,要么它属于某个指定集合,要么它不属于该集合,二者必居其一。互异性:同一个集合中的元素是互不相同的。无序性:任意改变集合中元素的排列次序,它们仍然表示同一个集合。”
定义空集m=se“),虽然元素是放在大括号里,但定义m={}是定义了一个字典,不是集合,但如果定义m={3,4,5}却是集合,这一点要特别注意。
可以拓展为任意范围内的勾股数,通过键盘输入,确定最大和最小值。可以求出任意范围内的勾股数。
Applnventor设计的程序,编写难度低又可以在手机上运行,这是它受到欢迎的原因之一。
编程思路与Python不同,与Scratch类似,需要将满足条件的值加入列表中,同时判断在同一循环中,满足条件的元素是否在列表中,以达到去重的目的。
手机上运行测试,可以得到我们想要的结果。程序需要输入求值范围,如果范围最大值不大于最小值,就提示错误,需要重新输入。
三种方法其实都要使用列表,算法也类似,但在Python中,集合是更简便、快捷的方法。通过二种编程环境和应用的比较,Python比Scratch要优化很多,Applnventor编程有它独有的特点,就是可以在手机上和其他应用一样使用。
希望大家可以通过二款软件的比较,掌握各自的特点和实用性,为进一步学习提供参考和帮助。