我用我自己的话,来说一说我对它的理解:
它的核心是isPrime数组,这个数组有什么用呢?它用来区分从1到100中,谁是素数,谁是合数。它是怎么区分的呢?它把素数设为True,而把合数设为False。它是用什么方法设置True和False的呢?它从2开始,4、6、8、10......都是2的倍数,所以都是合数,所以都设为False;然后是3,6、9、12......都是3的倍数,所以都是合数,所以都设为False;然后是4,4已经是False,所以看5......
通过这样的方法,就可以区分出素数和合数。
这道题值得一试,容易出成果,建议大家做一做。
- import stdarray
- import stdio
- import sys
- n = int(sys.argv[1])
- a = stdarray.create2D(n, n, True)
- for i in range(2, n):
- istimes = stdarray.create1D(n+1, True)
- istimes[i] = False
- for j in range(2, n//i+1):
- istimes[i*j] = False
- for j in range(i, n):
- for k in range(i, n):
- if (istimes[j] == False) and (istimes[k] == False):
- a[j][k] = False
- for row in a:
- for v in row:
- if v == True:
- stdio.write('* ')
- else:
- stdio.write(' ')
- stdio.writeln()
这里说一句,stdio和stdarray不是系统自带的,而是书的作者编的。所以刚开始是不能用的,如果想用,得去官网下载。
怎么在官网下载呢?首先进入这个网址Introduction to Programming in Python: An Interdisciplinary Approach (princeton.edu)
然后在To get started栏目里找到We also provide I/O libraries for reading and writing text, drawing graphics, and producing sound.点进去I/O libraries,进入这个网址:
Python Programs in the Textbook (princeton.edu)
然后就可以下载stdio-python.zip文件了,下载以后解压,里面有10个python文件,只需要把stdio.py和stdarray.py文件复制上,然后粘贴到.spyder-py3文件夹中,这时temp.py和stdio.py和stdarray.py三个文件都在.spyder-py3文件夹中,并且你还会发现,这三个文件都是平级的(意思是不存在temp.py文件在a文件夹中,然后a文件夹和stdio.py文件和stdarray.py文件在.spyder-py3文件夹中,因为这叫不平级),这下子你在temp.py文件里使用import stdio和import stdarray就不会报错了。
这道题的关键是什么呢?
这道题的核心,除了istimes数组以外,就是选出i和j互素的a[i][j],它是怎么选出的呢?它用排除法选出的,选出i和j不互素的a[i][j],剩下的就是i和j互素的a[i][j]。那它是怎么选出i和j不互素的a[i][j]的呢?它根据互素的定义:只有共同因子1,比如4和9,3和8,2和7,那么不互素就是有公因子的意思,比如2和4,4和6,6和9,所以我们选出有公因子的i和j就可以。那怎么选呢?我们用istimes数组,先从2开始,2设为False,然后4、6、8、10、12、14......凡是2的倍数,都设为False,这时我们从里面挑数,先挑4和6,不互素吧,然后挑4和8,也不互素吧,不信邪再试一个8和10,还是不互素吧,这说明什么?是不是说明,凡是设为False的俩数,就都是不互素的?嗯,确实是这样。然后循环,用一个新的istimes数组,从2后面的3开始,3设为False,然后6、9、12、15.......凡是3的倍数,都设为False,凡是设为False的俩数,就都是不互素的。然后循环,再用一个新的istimes数组,从3后面的4开始......是不是感觉有点奇妙啦?
我的代码,就是完全按照这个思路走的,大家质疑的,怀疑的,可以自己跑一跑看看哟。