java中输出1~20000内的所有素数,按每行5个打印出来,并分析程序中最费时的函数是什么, 如何改进?
时间: 2024-09-22 22:09:20 浏览: 55
在Java中,我们可以利用埃拉托斯特尼筛法(Sieve of Eratosthenes)来找出1到20000之间的素数。这个算法遍历每个数字,如果它是素数,则标记它的倍数为合数。以下是简单的实现:
```java
public class PrimeNumbers {
public static void main(String[] args) {
int limit = 20000;
boolean[] isPrime = new boolean[limit + 1];
for (int i = 2; i * i <= limit; i++) {
if (isPrime[i]) {
for (int j = i * i; j <= limit; j += i) {
isPrime[j] = false;
}
}
}
for (int i = 2; i <= limit; i++) {
if (isPrime[i]) {
System.out.print(i + " ");
if ((i - 1) % 5 == 0) {
System.out.println();
}
}
}
}
}
```
在这个程序中,`isPrime`数组用于记录每个数字是否是素数,`for`循环遍历从2到√n,这通常是筛选过程的主要部分,因为它减少了需要检查的数的数量。
最费时的函数是内层的`for`循环,即检查并更新`isPrime`数组的部分,尤其是对每个素数的倍数的标记。每次找到一个新的素数,都需要处理其所有倍数,这是时间复杂度较高的操作。
为了优化,可以考虑以下策略:
1. **提前结束筛选**:当找到某个质数p,只需继续标记p的平方及之后的偶数即可,因为大于p的偶数都不是质数。
2. **使用更高效的数据结构**:例如,可以只关注小于sqrt(n)的素数,因为较大质数的乘积肯定超过n。
注意:尽管有优化空间,对于较大的限制范围(如20000),上述程序的时间复杂度仍然属于线性的,所以实际运行效率较高,优化空间有限。不过,理论上的分析还是有助于理解性能瓶颈。
阅读全文