/** * 初级版本 */ @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); }
新闻热点
疑难解答