基本思路: 创建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;
}
该博客介绍了一种基本思路,通过创建一个boolean数组标记质数和合数,来找出小于给定数n的所有质数。代码中,从2开始遍历,将质数添加到列表并标记其倍数为合数。最后,输出所有质数并计算程序运行时间。这种方法优化了搜索范围,提高了效率。
588

被折叠的 条评论
为什么被折叠?



