📌  相关文章
📜  Java程序检查一个数字是否是素数

📅  最后修改于: 2022-05-13 01:58:09.611000             🧑  作者: Mango

Java程序检查一个数字是否是素数

给定一个正整数,检查该数是否为素数。素数是一个大于 1 的自然数,除了 1 和它自身之外没有正除数。前几个素数的例子是 {2, 3, 5,

例子 :

Input:  n = 11
Output: true

Input:  n = 15
Output: false

Input:  n = 1
Output: false

学校方法
一个简单的解决方案是遍历从 2 到 n-1 的所有数字,并检查每个数字是否除以 n。如果我们找到任何除数,我们返回 false。

// A school method based JAVA program
// to check if a number is prime
class GFG {
  
    static boolean isPrime(int n)
    {
        // Corner case
        if (n <= 1)
            return false;
  
        // Check from 2 to n-1
        for (int i = 2; i < n; i++)
            if (n % i == 0)
                return false;
  
        return true;
    }
  
    // Driver Program
    public static void main(String args[])
    {
        if (isPrime(11))
            System.out.println(" true");
        else
            System.out.println(" false");
        if (isPrime(15))
            System.out.println(" true");
        else
            System.out.println(" false");
    }
}
输出:
true
 false

该解决方案的时间复杂度为 O(n)


优化的学校方法
我们可以做以下优化:

  1. 我们可以检查直到 √n,而不是检查直到 n,因为 n 的较大因子必须是已经检查过的较小因子的倍数。
  2. 通过观察除 2 和 3 之外的所有素数的形式为 6k ± 1,可以进一步改进该算法。这是因为对于某个整数 k 和 i = ?,所有整数都可以表示为 (6k + i)。 1、0、1、2、3 或 4; 2 除 (6k + 0), (6k + 2), (6k + 4);和 3 个除法 (6k + 3)。所以更有效的方法是测试 n 是否能被 2 或 3 整除,然后检查 6k ± 1 形式的所有数字。(来源:维基百科)
    // A optimized school method based Java
    // program to check if a number is prime
    import java.io.*;
      
    class GFG {
      
        static boolean isPrime(int n)
        {
            // Corner cases
            if (n <= 1)
                return false;
            if (n <= 3)
                return true;
      
            // This is checked so that we can skip
            // middle five numbers in below loop
            if (n % 2 == 0 || n % 3 == 0)
                return false;
      
            for (int i = 5; i * i <= n; i = i + 6)
                if (n % i == 0 || n % (i + 2) == 0)
                    return false;
      
            return true;
        }
      
        // Driver Program
        public static void main(String args[])
        {
            if (isPrime(11))
                System.out.println(" true");
            else
                System.out.println(" false");
            if (isPrime(15))
                System.out.println(" true");
            else
                System.out.println(" false");
        }
    }
    
    输出:
    true
     false
    

    该解的时间复杂度为 O(√n)

    主条目:素性检验 |第 1 套(介绍和学校方法)

    参考:
    https://en.wikipedia.org/wiki/Prime_number
    http://www.cse.iitk.ac.in/users/manindra/presentations/FLTBasedTests.pdf
    https://en.wikipedia.org/wiki/Primality_test