/**
* 初级版本
*/
@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);
}