使用篩選法,生成正整數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。...