#返回型別:列表
#說明:返回小於upperbound的所有素數
def oulashai(upperbound):
filter=[false for i in range(upperbound+1)]
primenumbers=
for num in range(2,upperbound+1):
if not filter[num]:
for prime in primenumbers:
if num*prime>upperbound:
break
filter[num*prime]=true
if num%prime==0: #這句是最有意思的地方 下面解釋
break;
return primenumbers
def test():
correctresult_30=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
oulashairesult_30=oulashai(30)
if(oulashairesult_30==correctresult_30):
print('correct')
else:
print('wrong')
if __name__=='__main__':
test()
if num%prime==0 這句我苦思冥想許久,在此將想法分享給大家。
假設沒有這句話,程式依然能得到正確的結果,只不過是有很多無用的篩選。
例如24 什麼時候會篩它呢 2*12 3*8 4*6 6*4 8*3 12*2
其實我們只用在2*12時將其篩去即可
也就是說a*b==c僅當a是c最小的素數因子時篩去c
if num%prime==0 然後break掉 就是為了保證上述條件
若num%prime==0 則存在q∈整數 使得num==prime*q (prime<=q )
next(prime)*num == next(prime)*prime*q == prime*next(prime)*q ( prime而數 prime*next(prime)*q 應由 num==next(prime)*q 時篩去
所以此時的num已經篩數完成( 已經是萎了 篩不動了) 應執行num+1的篩數
線篩 尤拉篩 線性篩選素數
題目描述 用線行篩篩選素數,將指定範圍的素數找出,達到o n 的效果。思路時間複雜度 0 n 思路任意值必然可以被分解為 a b1 c1 b2 c2 例如9 3 3,15 3 5,55 5 11 即所有的合數都可以被拆解為素數倍數的乘積。當我們從2開始找到素數與含有素數的合數,將合數標記為非素數,每...
素數篩選法和尤拉篩選法
素數判斷 素數篩選法 用素數篩選合數 include include define max n 100 素數篩選法 int prime max n 5 初始化為0 void init int main printf n return0 求2 n內每個數的最小素因子 include include d...
素數線性篩法(尤拉篩)
之前寫的埃式篩法複雜度達o n log n lo gn o n logn logn o n lo gn l ogn 在大數字的時候可能複雜度還不夠理想。這種做法對於乙個合數有可能會篩了多次,導致重複做功。引入尤拉篩法能夠解決這種多次篩同乙個數字的情況,理論演算法複雜度o n o n o n 精髓在於...