對於初學python的小白而言,求質數是大家首先拿來練手的題目,通過求質數方法的優化,以加深對所學語法、資料結構的理解,下面我麼就求質數的多種方法加深對for迴圈、列表、以及set的理解
1、普通求解
print(2,end=' ')
for i in range(3,100000,2):#排除偶數,只求奇數,計算量減少一半
for j in range(3,i**0.5+1,2):
if i%j == 0:
break
else:
print(i, end=' ')
這種方法主要是完成對for迴圈的應用,同時,通過處理,儘量減少for迴圈的迭代次數,提高執行效率。當然,由於所有質數都在6的倍數左右,因此,可以在計算中使用這一特性,**如下:
print(2,3) #2和3特殊處理
i = 5
k = 2
while i <= 100000:
for j in range(3,int(i**
0.5)+1,2):
if i%j == 0:
break
else:
print(i)
i += k #通過改變k的值,使i在6的倍數左右
k = 方6
2、使用列表的方法:
通過對質數性質的了解,我們了解到判斷乙個數是否為質數,我們只需要將其對比其小的數求餘即可,因此,我們可以建立乙個列表,將所求的質數新增到列表中,**如下
lprime = [2,3]
i = 5
k = 2
while
i<= 100:
forj in lprime:
ifi%j == 0:
break
else:
i += k
k = k^6
print(lprime)
n = 100000
nums = [0]*(n+1) #建立乙個列表,長度為質數求取範圍
for i in range(2,int(n**0.5)+1): #將所有索引值為非質數的元素標記為1
if nums[i]:
continue
for j in range(i**2,n+1,i):
if nums[j]:
continue
nums[j] = 1
for i in range(2,n+1):
ifnot nums[i]:
pass
print(i)
通過使用列表標記的方法,一次性建立乙個列表,其時間複雜度會大幅度降低,在此過程中,我們需要了解列表的特性,怎麼樣的程式才能降低程式的時間複雜度,同時,當空間複雜度和時間複雜度相衝突時,我們應該怎麼樣取取捨
3、使用set集合的方法
set時無序的、可變的、不重複的元素的集合,由於對set內元素的讀取是通過hash值來實現的,因此讀寫速度特別快,我們可以根據這一特性來求質數
n = 100000
primeset = set(range(1,n,2))
m = int(n**0.5)+1
for i in range(3,m,2):
if i not
in primeset:
continue
for j in range(i**2,n+1,i*2):
primeset.discard(j)
print(primeset)
以上程式利用了set內部元素可變、無序,讀取刪除快的特點,因此提高了程式效率
總結
(1)在初學階段,我們更注重於如何去解決問題,使用最初級的手段解決複雜問題時,要注意不能缺項漏項,培養嚴謹的作風
(2)在使用語言為我們提供的內建資料結構時,要對資料結構有清晰的了解,這樣才能寫出高效的**
(3)對乙個問題的反覆思考,對**的反覆改進,有助於加深對語言本身的理解,這對於初學階段的人是十分必要的
python怎麼求質數 Python中質數怎麼找?
質數是指在大於1的自然數中,除了1和它本身以外不再有其他因數的自然數。python中怎麼查詢質數呢?1 首先我們建立乙個空的list 然後我們知道2是最小的質數,於是我們把2新增進這個空白的list 2 之後我們開始迴圈,第乙個數從3開始 用3除以小於3的質數,沒有小於它的質數能被它整除 我們將3再...
Python求質數 素數
先寫乙個裝飾器d1.py,為了測試執行時間 from functools import wraps import time deff1 func wraps func deff2 begin time.time func end time.time print cost end begin retu...
python 案例010(求質數)
重點是什麼是質數,以及怎麼求質數 usr bin python coding utf 8 find prime number 判斷101 200之間有多少個素數,並輸出所有素數。何為素數 質數 外文名prime number 又稱素數,有無限個。質數定義為在大於1的自然數中,除了1和它本身以外不再有...