/** * 初級版本 */ @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); }/** * 百萬以內素數最快算法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); }最后經過查資料又發現了6N+/-法,得到了最后的組合版本/** * 篩選和開方同時使用,組合版本,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); }
新聞熱點
疑難解答