目录
题目要求
判断101-200之间有多少素数,输出这些素数
需求分析
除主方法外,写一个isPrime方法判断是否为素数
思路整理
isPrime方法利用如下方法判断是否为素数:
- 除2和3之外,所有的素数都可以表示为6n±1的形式(n为自然数)。换句话说,除了2和3,所有的素数在除以6后,余数要么是1,要么是5。
- 但并不是所有形式为“6n±1”的数都是素数,这个数也可能是6k±1(k为自然数)的倍数。
- isPrime方法的流程分3步:
- 是不是2或3?-> 是 -> 返回true
- 是不是6n±1? -> 否 -> 返回false
- 是不是合数? -> 否 -> 返回false
- 返回true
代码实现
public class PrimeNumber {
public static void main(String[] args) {
int count = 0;
for (int i = 101; i <= 200; i++) {
if (isPrime(i)) {
System.out.print(i + " ");
count++;
}
}
System.out.println("\n" + "101-200之间共有" + count + "个素数");
}
/**
* 用于判断一个整数是否为素数
* @param num 待判断的整数
* @return 如果num是素数,则返回true;否则返回false。
*
* 本方法基于以下原理进行素数判断:
* 除了2和3以外,所有的素数都可以表示为6n±1的形式,其中n是自然数。
* 但并不是所有满足6n±1形式的数都是素数,因此需要进行进一步的判断。
*/
public static boolean isPrime(int num) {
// 2和3都是素数,直接返回true
if (num == 2 || num == 3) {
return true;
}
// 首先,对6取余,排除不满足6n±1形式的数
// 如果num对6取余不等于1且不等于5,那么num不是素数
// 注意:不能使用if(num%6!=1||num%6!=5),因为这样会使得所有数都满足条件
if (num % 6 != 1 && num % 6 != 5) {
return false;
}
// 接下来,对num进行循环判断,检查其是否为6k±1的倍数
// 从5开始,每次增加6,i表示6n-1形式的数,i+2表示6n+1形式的数
// 如果num能被i或i+2整除,则num不是素数
// 只需要检查到num的平方根即可,因为一个大于平方根的因子必然与一个小于平方根的因子配对
for (int i = 5; i <= Math.sqrt(num); i += 6) {
if (num % i == 0 || num % (i + 2) == 0) {
return false;
}
}
return true;
}
}
运行预览
以上即为利用java实现素数判断的代码,如有任何错漏、不足、可简化提升之处,敬请批评指正!
2024年4月7日