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)
优化的学校方法
我们可以做以下优化:
- 我们可以检查直到 √n,而不是检查直到 n,因为 n 的较大因子必须是已经检查过的较小因子的倍数。
- 通过观察除 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