判断素数的方法
素数: 一个正整数,如果只有1和它本身两个因数,那么它就是一个素数。
用 Java 代码判断数字 n 是否为素数,方法有很多,这里介绍三种
其实这三种方法本质上都是遍历,不过遍历的次数相差很大
- 第一种:遍历 [2,n)
- 第二种:遍历 (2,根号n]
- 第三种:遍历 (5,根号n]
第一种:遍历 [2,n)
方法: 用 n 对 [2,n) 中的数字进行整除,如果都不能整除,那么 n 为素数
public static void main(String[] args) {
System.out.print("输入数字: ");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
// 标志位,默认输入的数字是素数
boolean flag = true;
if(num == 2){
flag = true;
}
// 循环遍历,进行判断
for(int i = 2; i < num; i++){
// 如果余数为 0,标志位改为 false,同时退出循环
if (num % i == 0){
flag = false;
break;
}
}
// 根据标志位判断
if (flag){
System.out.println(num + "是素数");
} else {
System.out.println(num + "不是素数");
}
}
第二种:遍历 (2,根号n]
方法: 假设 a * b = c,且 c = m * m ,则会发现 a <= m,b >= m
对于素数 n 而言,只有 1 * n = n 一种情况,因此如果 (2,根号n] 中没有一个数字可以整除,那么 n 是素数
// 代码跟第一种大体相同,只是循环的条件发生了变化
for(int i = 2; i <= Math.sqrt(num); i++)
第三种:遍历 (5,根号n]
方法: 当 n >= 5时,如果 n 为素数,那么 n 一定在 6 的倍数旁边出现
原因: 在大于 5 的情况下,如果 n 是素数,那么 n 一定是一个奇数
将 5 和 5 之后的数字表示成下面这种形式:
6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+6),6(x+1)+1
上面数字的形式可以改成这样:6x-1,6x,6x+1,2(3(x+1)) ,3(2x+1) …
于是会发现: 6x,6x+2,6x+3,6x+4 都可以被整除,6x+5 就相当于是下一个 6x-1
由此可见,素数只可能出现在 6x-1 和 6x+1 的位置,即 6 的倍数的左右出现
注意:6 的倍数左右的数字不一定是素数,需要循环排除
public static void main(String[] args) {
System.out.print("输入数字: ");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
// 标志位,默认是素数
boolean flag = true;
if(num == 2 || num == 3 || num == 5){
flag = true;
}
// 判断该数字是否是 6 的倍数左右的数字
// 如果不是,那么它一定不是素数
if (num % 6 != 1 && num % 6 != 5) {
flag = false;
}
// 如果是 6 的倍数左右的数字,进行筛选,看 num 是否是它们的倍数
for(int i = 5; i <= Math.sqrt(num); i += 6){
// 在 [5,根号 num] 中对 6 左右的数字进行判断
// 执行一次循环,i = i + 6
// 如果发现 num 能整除,表示不是素数
if (num % i == 0 || num % (i + 2) == 0){
flag = false;
break;
}
}
if (flag){
System.out.println(num + "是素数");
} else {
System.out.println(num + "不是素数");
}
}