【发布时间】:2021-08-04 16:10:39
【问题描述】:
我试图用 Java 构建一个简单的程序来打印前 N 个素数。
这是我的程序,在输入 N=10000 之前它工作正常,但是如果我们将输入增加到 N=100000,它会进入一个连续循环并花费大量时间。我尝试对其进行更多优化,以便它可以在输入 N=100000 时正常工作,但运气不佳。您能否建议我们是否可以优化代码以使其适用于较大的输入?
public class PrintPrimes {
public static void main(String[] args) {
Scanner s = new Scanner(System.in); //it will take input
int n = s.nextInt();
int number = 3;
System.out.print("2" + " ");
while (n > 1) {
if (checkPrime(number)) {
System.out.print(number + " ");
n--;
}
number++;
}
}
public static boolean checkPrime(int number) {
for (int i = 2; i <= number / 2; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
}
感谢您的帮助,谢谢!
【问题讨论】:
-
你可以实现一个Sieve of Eratosthenes。
-
您在这里实现的方法是臭名昭著的Trial Division。我说臭名昭著是因为程序员经常错误地认为它是 Eratosthenes 的筛子,或者实际上与它相同。然而,真正的埃拉托色尼筛算法没有除法,而且 Big-O 复杂度要小得多,因此运行速度要快得多。
-
你的 int 无声地溢出。切换到长。
-
对于 N=100000,它在我的笔记本上运行大约 2 分钟。但是,我用
.println替换了.print- 我怀疑在一行中累积100000 个结果会占用大量内存和CPU 进行缓冲。