python(8) ======== 打印一個範圍內的素數

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

相關文章
相關標籤/搜索