2018-01-22 python
一、什麼是素數?spa
除了1和他自己外,不能被任何數整除的整數叫素數。2是最小的素數。code
2.思路blog
好比說打印1~20內的素數class
整體歸納:由他的定義出發,第一他確定是個整數。第二就是最重要的,也就是咱們的的判斷方法,假如給定一個區間,咱們怎麼樣去判斷它是一個素數。這裏的判斷方法咱們確定是用一個數去除另外一個數,因此這裏就出現了除數與被除數。效率
a:除數與被除數的範圍 (循環)import
b:除數/被除數能夠整除。。。。。,不能夠整除。。。。(判斷)變量
[root@python3_ansible python]# cat sushu.py #!/usr/bin/python3 for i in range(2,21): for j in range(2,i-1): if i%j == 0: continue else: print (i)
[root@python3_ansible python]# python3 sushu.py |head
5
5
6
7
7
7
7
8
8
8
錯誤分析:
被除數範圍錯誤:好比說除數是5,被除數的取值範圍應該是2-4,而在Python中2-4的表示應該爲(2,5)
邏判斷錯誤:若是是i=5;按照上面的寫法,j=2 j=3;5%2 != 0 print 5 ;5%3 != 0 print 5;
若是說i=6;按照上面的寫法,j=2 j=3 j=4 ; 6%2 = 0 continue ;6%3 = 0 continue ;6%4 != 0 print 6
這裏顯然是不對的,若是這裏使用continue,若是除數遇到能夠整除的被除數,只是將能夠整除的被除數跳過,仍是會遍歷完不能整除的被除數。這個地方改爲break
[root@python3_ansible python]# cat sushu1.py
#!/usr/bin/python3循環
for i in range(2,21):
for j in range(2,i):
if i%j == 0:
break
else:
print (i)
[root@python3_ansible python]# python3 sushu1.py |head
3
5
5
5
7
7
7
7
7
9遍歷
錯誤分析:修改完成之後,雖然可以保證全都是素數,可是這些素數每遍歷一次被除數就會打印一次,咱們想要的只要他是素數就直接打印出來,而不會去遍歷被除數。
這裏引進一個新思路 flag
在看flag 以前看下python 的縮進引起的問題,若是代碼是這樣的會有怎樣的結果
[root@python3_ansible python]# cat sushu1.py
#!/usr/bin/python3
for i in range(2,21):
for j in range(2,i):
if i%j == 0:
break
print (i)
[root@python3_ansible python]# python3 sushu1.py |head
2
3
4
5
6
7
8
9
10
11
這樣就把被除數全都打印出來了,不管你中間經歷了什麼,Python 只看縮進,若是最後的print(i)和第一行循環差四個空格,python 就默認爲這是在遍歷i的值
[root@python3_ansible python]# cat sushu1.py
#!/usr/bin/python3
for i in range(2,21):
for j in range(2,i):
if i%j == 0:
break
print (i)
[root@python3_ansible python]# python3 sushu1.py |head
20
若是是這樣,print(i)與循環並齊,打印的是循環完成之後的結果。
[root@python3_ansible python]# cat sushu2.py
#!/usr/bin/python3
temp = 0
for i in range(2,21):
# temp = 0
for j in range(2,i):
if i%j == 0:
break
else:
temp = 1
if temp == 1:
print (i)
[root@python3_ansible python]# python3 sushu2.py |head
3
4
5
6
7
8
9
10
11
12
在Python中變量的初始值必須被定義,這個的錯誤緣由是由於變量被賦值了一次;以i=4 爲例,緊接着上一次循環,i=3的打印結束的時候,
temp=1;因此當i=4的時候,temp依然等於1;4%2雖然等於0,結束了內層循環,但temp的值依然等於1,打印i=4.
==================================終極版==================================================
[root@python3_ansible python]# cat sushu2.py
#!/usr/bin/python3
for i in range(2,21):
temp = 0
for j in range(2,i):
if i%j == 0:
break
else:
temp = 1
if temp == 1:
print (i)
[root@python3_ansible python]# python3 sushu2.py
3
5
7
9
11
13
15
17
19
把temp 的值賦值在循環裏面,問題就解決了,i 每一次獲得外層循環的一個值,temp=0.
這種方法效率特別低下,由於每個除數每取到一個值,都要遍歷一遍被除數。例如除數等於5,他就要除盡2-4之間的任何一個被除數,效率
低下。
y=a*b
縮小被除數的區間
[root@python3_ansible python]# cat sushu3.py
#!/usr/bin/python3
for i in range(2,21):
temp = 0
x = int(i/2)
for j in range(2,x+1):
if i%x == 0:
break
else:
temp = 1
if temp == 1:
print(i)
[root@python3_ansible python]# python3 sushu3.py
5
7
9
11
13
15
17
19
[root@python3_ansible python]# cat sushu4.py
#!/usr/bin/python3
import mathfor i in range(2,21): temp = 0 x = int(math.sqrt(i)) for j in (2,x+1): if i%j == 0: break else: temp = 1 if temp == 1: print(i)[root@python3_ansible python]# python3 sushu4.py 35791113151719