基本思路: 创建boolean数组大小为N+1,下标对应相应的数值。质数标记为true,合数标记为false。primeList储存被标记为true的质数。
i遍历到 | 标记的合数 |
---|---|
2 | 2×2=4 |
3 | 3×2=6 3×3=9 |
4 | 4×2=8 |
5 | 5×2=10 5×3=15 5×5=25 |
6 | 6×2=12 |
7 | 7×2=14 7×3=21 7×5=35 7×7=49 |
… | … |
JAVA代码
List<Integer> getPrimeNumberList(int n) {
// 开始时间
long begin = System.nanoTime();
int m = n + 1;
boolean[] isPrime = new boolean[m];
// 质数为true,合数为false
Arrays.fill(isPrime, true);
// 储存质数
List<Integer> primeList = new ArrayList<>();
for (int i = 2; i < m; i++) {
if (isPrime[i]) {
primeList.add(i);
}
if (i < Math.abs(m / 2)) { // 已确定最小的质数为2 (优化代码)
for (int j : primeList) {
if (i * j >= m) {
break;
}
isPrime[i * j] = false; // 标记为合数
if (i % j == 0) {
break;
}
}
}
}
primeList.add(0, 1);
// 结束时间
long end = System.nanoTime();
System.out.println("程序运行的时间为:" + (end - begin) + "微秒");
return primeList;
}