天天看點

python列印一定範圍内的素數_python(8) ======== 列印一個範圍内的素數

[[email protected]_ansible python]# cat sushu.py

#!/usr/bin/python3for i in range(2,21):for j in range(2,i-1):if i%j == 0:continue

else:

print (i)

[[email protected]_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

[[email protected]_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)

[[email protected]_ansible python]# python3 sushu1.py |head

3

5

5

5

7

7

7

7

7

9

錯誤分析:修改完成以後,雖然能夠保證全都是素數,但是這些素數每周遊一次被除數就會列印一次,我們想要的隻要他是素數就直接列印出來,而不會去周遊被除數。

這裡引進一個新思路 flag

在看flag 之前看下python 的縮進引發的問題,如果代碼是這樣的會有怎樣的結果

[[email protected]_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)

[[email protected]_ansible python]# python3 sushu1.py |head

2

3

4

5

6

7

8

9

10

11

這樣就把被除數全都列印出來了,無論你中間經曆了什麼,Python 隻看縮進,如果最後的print(i)和第一行循環差四個空格,python 就預設為這是在周遊i的值

[[email protected]_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)

[[email protected]_ansible python]# python3 sushu1.py |head

20

如果是這樣,print(i)與循環并齊,列印的是循環完成以後的結果。

[[email protected]_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)

[[email protected]_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.

==================================終極版==================================================

[[email protected]_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)

[[email protected]_ansible python]# python3 sushu2.py

3

5

7

9

11

13

15

17

19

把temp 的值指派在循環裡面,問題就解決了,i 每一次得到外層循環的一個值,temp=0.

這種方法效率特别低下,因為每一個除數每取到一個值,都要周遊一遍被除數。例如除數等于5,他就要除盡2-4之間的任何一個被除數,效率

低下。

y=a*b

縮小被除數的區間

[[email protected]_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)

[[email protected]_ansible python]# python3 sushu3.py

5

7

9

11

13

15

17

19

[[email protected]_ansible python]# cat sushu4.py

#!/usr/bin/python3

import math

for 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)

[[email protected]_ansible python]# python3 sushu4.py

3

5

7

9

11

13

15

17

19