📜  显示从 1 到 N 的所有质数的Java程序(1)

📅  最后修改于: 2023-12-03 15:10:31.346000             🧑  作者: Mango

Java程序:显示从 1 到 N 的所有质数

这个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 + " ");
            }
        }
    }
}
代码说明
  • 导入Scanner类,以接收用户输入。
  • 用户输入一个正整数N。
  • 对于从2到N之间的每一个整数i,判断它是否是质数:
    • 从2到i-1之间的每一个整数j,试图将i除以j取模,如果模为0,则说明i不是质数,跳出循环;否则,说明i还可能是质数,继续循环。
    • 如果j循环完毕后,仍然是isPrime=true,说明i是质数,输出i。
效果截图

image

分析和改进

这个算法的时间复杂度是O(N^2),空间复杂度是O(1)。对于小规模的N,它是一个简单直接、容易理解的解法。但是对于大规模的N,速度慢、占用内存多的问题就显而易见了。因此,我们需要对程序进行性能分析和优化。

对于这个程序,最容易优化的部分,是从2到i-1之间的整数j的循环。在程序中,我们试图将i除以每一个j,并判断是否能整除。实际上,除数的范围可以被进一步缩小。具体来说:

  • 对于任意一个正整数i,它的质因数的个数不会超过log2(i)。
  • 因为质因数之间一定不存在倍数关系,所以我们只需要考虑小于或等于√i的质数。

基于这些性质,我们可以将程序代码优化如下:

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,算法的效率可以通过进一步的优化得到提升。