Solution - Check Prime Number

Problem.
Write a Java program that prompts the user to enter an integer and then checks whether that integer is a prime number. A prime number is a positive integer greater than 1 that has no positive integer divisors other than 1 and itself.

编写一个 Java 程序,提示用户输入一个整数,然后检查该整数是否为质数。质数是一个大于 1 的正整数,除了 1 和它本身之外没有正整数因子。

Solution.

import java.util.Scanner;

public class PrimeChecker {
    public static void main(String[] args) {
        // 从键盘输入一个数
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a positive integer: ");
        int num = input.nextInt();
        input.close();
        
        // 调用isPrime()方法,检验输入的整数是不是质数
        if (isPrime(num)) {
            System.out.println(num + " is a prime number.");
        } else {
            System.out.println(num + " is not a prime number.");
        }
    }
    
    // method to check whether a number is prime
    static boolean isPrime(int num) {

        if (num == 2) return true;   //如果是2,返回true;

    //程序如果运行到这里,num不可能是2

        if (num <= 1 || num % 2 == 0) { 
        	System.out.printf("%d = %d * %d \n",num, 2, num/2); //打印分解方案
        	return false;
        } //如果输入的数小于等于1,或者是偶数,那么不是质数,返回false (注:这里num不可能是2)

    //程序如果运行到这里,num就 不可能 小于等于1或者是偶数

        // 开始除以3,5,7,...,因为所有的偶数在前面以及判断过了,这里只判断是否可以被奇数整除
        int sr = (int) Math.sqrt(num);
        for (int i = 3; i <= sr; i+=2) {
            if (num % i == 0) {
            	System.out.printf("%d = %d * %d \n",num, i, num/i); //打印分解方案
                return false;
            }
        }
        return true;
    }
  
}

该程序首先提示用户输入一个正整数,并使用 Scanner 读取输入。然后,它调用一个名为 isPrime() 的辅助方法来检查该数字是否为质数。isPrime() 方法使用一个简单的算法来检查:

  • 该数字是不是2?如果是,返回true(跳过后续代码,否则,继续执行后续的代码);
  • 该数字是否小于等于1或者可以被2整除?如果是,返回false(跳过后续代码,否则继续执行后续的代码);
  • 该数字是否可以被3 到 它平方根的一个奇数整除?如果是,打印分解方案,然后返回false (最后一行的return true会被跳过);
  • 如果for循环检验完毕也没有返回false,说明没有找到可以整除它的数,该数字是个质数,返回 true。

最后,主方法根据 isPrime() 的返回值输出指示该数字是否为质数的消息。

Tips.

  • 如果if {} 的代码块只有一行,可以省略花括号 {}.比如

if (num == 2) return true;,等价于if (num == 2) {return true;}