百萬以內素數快速查詢
阿新 • • 發佈:2018-12-31
/** * 初級版本 */ @Test public void prime() { long date = System.currentTimeMillis(); System.out.println(date); for (int i = 1; i <= 1000000; i++) { for (int j = 2; j <= i; j++) { if (i % j == 0) { if (i / j > 1) break; System.out.println(i + "是素數"); } } } date = System.currentTimeMillis() - date; System.out.println(date); }
/** *<p> * 進階版本 * </p> *<p> * 1的處理仍然存在問題 * </p> */ @Test public void prime1() { long date = System.currentTimeMillis(); System.out.println(date); for (int i = 1; i <= 1000000; i++) { for (int j = 1; j <= i; j++) { if (j * j <= i) { if (i % j == 0 && j != 1) break; continue; } // if (i < 10000) System.out.println(i + "是素數"); break; } } date = System.currentTimeMillis() - date; System.out.println(date); System.out.println(265); }
最後經過查資料又發現了6N+/-法,得到了最後的組合版本/** * 百萬以內素數最快演算法562ms 最終版本 */ @Test public void prime2() { long date = System.currentTimeMillis(); p: for (int i = 1; i <= 1000000; i++) { for (int j = 2; j * j <= i; j++) {// 1不經過迴圈直接跳過,避免了1分別作為除數和被除數的特殊情況的判斷 // 一個數如果是合數,那麼它的所有的因子不超過它的開方 if (i % j == 0) continue p;// 一旦發現因子,立即跳出對當前數的判斷 } // if(i<10000) System.out.println(i); } date -= System.currentTimeMillis(); System.out.println(-date); }
/**
* 篩選和開方同時使用,組合版本,500ms
*/
@Test
public void prime3() {
long date = System.currentTimeMillis();
p: for (int i = 1; i <= 1000000; i++) {
if (i > 10000 && i % 6 != 1 && i % 6 != 5)// 設定數字篩選,不符合6N法則,直接跳過
continue;
for (int j = 2; j * j <= i; j++) {// 1不經過迴圈直接跳過,避免了1分別作為除數和被除數的特殊情況的判斷
// 一個數如果是合數,那麼它的所有的因子不超過它的開方
if (i % j == 0)
continue p;// 一旦發現因子,立即跳出對當前數的判斷
}
// if (i < 10000)
System.out.println(i);
}
date -= System.currentTimeMillis();
System.out.println(-date);
}