篩選法獲取素數列表

2021-09-26 15:30:07 字數 1928 閱讀 2920

使用篩選法,生成正整數n以內素數列表。

演算法描述:

初始設定bitset從0到n的值均為true。

從2開始,由於2是素數,所以將所有2的倍數排除;然後下乙個素數是3,則將所有3的倍數排除;下乙個素數是

5,將所有5的倍數排除…

以此類推,直到n。

bitset中剩餘的值為true的index即為素數。

具體**:

/**

* 篩選法生成正整數n以內素數列表

* 描述:

* 初始設定bitset從0到n的值均為true

* 從2開始,由於2是素數,所以將所有2的倍數排除

* 然後下乙個素數是3,則將所有3的倍數排除

* 下乙個素數是5,將所有5的倍數排除

* ...

* 直到n

* bitset中剩餘的值為true的index即為素數

** @param n 正整數

* @return 素數表,用 bitset 表示

*/public

static bitset genprimebitset

(int n)}}

return primebitset;

}

測試**:

public

static

void

main

(string[

] args)

}long end = system.

currenttimemillis()

; sb.

delete

(sb.

tostring()

.length()

-1, sb.

tostring()

.length()

);string desc = n +

" 以內共 "

+ num +

" 個素數,耗時 "

+(end - begin)

+"毫秒"

; sb.

(system.

lineseparator()

).(desc)

; system.out.

println

(sb.

tostring()

);}

以上**輸出為:

2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997

1000 以內共 168 個素數,耗時 3毫秒

等差素數列(列舉 素數篩選法)

題目如下 2,3,5,7,11,13,是素數序列。類似 7,37,67,97,127,157 這樣完全由素數組成的等差數列,叫等差素數數列。上邊的數列公差為30,長度為6。這是數論領域一項驚人的成果!2004年,格林與華人陶哲軒合作證明了 存在任意長度的素數等差數列。有這一理論為基礎,請你借助手中的...

素數篩選法

篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...

素數篩選法

素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。int vis maxn for int i 2 i n i for int j i 2 j n j i vis j 1 這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。...