篩法求2到n的所有素數

2021-10-02 06:47:08 字數 1227 閱讀 1913

我用了三種方法

先上**:

public

static

int[

]isprime

(int n)

for(

int i =

2; i <= n; i++)}

}int

prime =

newint

[n];

int pnum =0;

for(

int i =

2; i <= n; i++)}

return prime;

}public

static

int[

]eratosthenes

(int n)

for(

int i =

2; i <= n; i++)}

}int

prime =

newint

[n];

int pnum =0;

for(

int i =

2; i <= n; i++)}

return prime;

}public

static

int[

]euler

(int n)

}return prime;

}

最簡單的方法: 直接讓2到n每個數除以比它小的所有數, 若某次整除, 則不是素數.實際上只需要除以小於n

\sqrt n

n​的正數. 時間複雜度:o(n

n)

o(n\sqrt n)

o(nn​)

埃拉託斯特尼(eratosthenes)篩法(一般篩). 思路就是素數的倍數不是素數, 將所有素數的倍數篩掉, 留下的就是素數. 時間複雜度: o(n

log⁡

log⁡n)

o(n\log\log n)

o(nlog

logn

)尤拉篩(線性篩). 埃氏篩會有重複, 尤拉篩是在埃氏篩的基礎上改進, 使得每個數隻篩選一次.

與埃氏篩最大的不同在於:

num[i * prime[j]]=

true;if

(i % prime[j]==0

)break

;

這行**保證了每個數隻被他的最小質因數篩一遍.

時間複雜度:o(n

)o(n)

o(n)

求N內的所有素數

1 素數及相關 素數,又稱質數,在乙個大於1的自然數中,除了1和此整數自身之外,不能被其他自然數整除的數。比1大但不是素數的數稱為合數。1和0既不是素數,也不是合數。算術基本定理證明每個大於1的正整數都可以寫成素數的乘積,並且這種乘積的形式是唯一的。2 試除法求素數 演算法描述 根據素數的定義可知,...

求N以內的所有素數

如下 include stdafx.h include conio.h include math.h include malloc.h typedef long long prime typedef struct pn 構造素數節點 struct pn next pn static pn prime...

篩法求n以內的素數

篩法求素數 把2到n中所有的數都列出來,然後從2開始,先劃掉n內所有2 的倍數,然後每次從下乙個剩下的數 必然是素數 開始,劃掉其n內的所有倍數。最後剩下的數,就都是素數。空間換時間,加快了計算速度。include include include include define maxn 100000...