📅  最后修改于: 2023-12-03 15:10:31.346000             🧑  作者: Mango
这个Java程序可以找到并显示从1到N的所有质数。所谓“质数”,是指只能被1和自身整除的整数,例如2、3、5、7、11、13等。
输入一个正整数N,程序将输出从1到N之间的所有质数。该程序使用的是最简单有效的算法:试除法。简单的说就是,从2到N-1之间的所有整数,逐个尝试是否能被N整除,如果不能,则N就是质数。
import java.util.Scanner;
public class PrimeNumbers {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个正整数 N:");
int n = scanner.nextInt();
System.out.print("1到" + n + "之间的所有质数为:");
for (int i = 2; i <= n; i++) {
boolean isPrime = true;
for (int j = 2; j < i; j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
System.out.print(i + " ");
}
}
}
}
这个算法的时间复杂度是O(N^2),空间复杂度是O(1)。对于小规模的N,它是一个简单直接、容易理解的解法。但是对于大规模的N,速度慢、占用内存多的问题就显而易见了。因此,我们需要对程序进行性能分析和优化。
对于这个程序,最容易优化的部分,是从2到i-1之间的整数j的循环。在程序中,我们试图将i除以每一个j,并判断是否能整除。实际上,除数的范围可以被进一步缩小。具体来说:
基于这些性质,我们可以将程序代码优化如下:
import java.util.Scanner;
public class PrimeNumbers {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个正整数 N:");
int n = scanner.nextInt();
System.out.print("1到" + n + "之间的所有质数为:");
for (int i = 2; i <= n; i++) {
boolean isPrime = true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
System.out.print(i + " ");
}
}
}
}
这个版本的程序,时间复杂度是O(N*√N),空间复杂度依然是O(1)。在实践中,这个版本的程序要比原来的版本快得多。
这个Java程序演示了如何使用最简单有效的算法,来找到从1到N之间的所有质数。虽然该算法的效率低,但对于小规模的N,它是一个简单有效的解法。对于大规模的N,算法的效率可以通过进一步的优化得到提升。