最近刷题刷到了包含判断素数问题的题型,这里写篇博客来分享下!
首先我们来讲下什么是素数
1、素数的概念
- 素数在数学中我们也叫:质数,两个是一个东西
- 素数:一个大于1的整数,只能被 1 和 自身 整除的的整数,这种整数我们称为:素数,否则称为:合数;例如:2,3,5,7,11,13 都是素数
- 补充:大于 2 的所有质数都是 奇数
2、方法一
- 1、我们就是单纯的根据素数概念来判断素数,对于 2 这个素数我们单独判断,例如:判断 5 是否为素数,那我们就根据:5%2,5%3,5%4 求余结果都不为 0 则为素数,否反之亦然。那就是对于给定的大于 2 的自然数,我们用 n%【2,3,…,n-1】判断结果是否为 0 就好
- 2、 我们再添加一个条件,那就是:大于 2 的所有质数都是 奇数,所以对于从 3 开始每次 +=2 只判断奇数即可
代码:
public static boolean isPrime(int n){
if (n<=3){
return n>1;
}
for (int i = 2;i<n;i++){
if (n%i==0){
//不是素数
return false;
}
}
return true;
}
2、方法二
优化
- 不大于根号n的最大的整数还没有整除n,那么这个n肯定是素数
说明:如果一个大于根号n的整数m能整除n,那么n/m一定是一个小于根号n的一个整数
代码
public static boolean isPrime(int n){
if (n<=3){
return n>1;
}
for (int i = 2;i<=Math.sqrt(n);i++){
if (n%i==0){
//不是素数
return false;
}
}
return true;
}
2、方法三
孪生素数:孪生素数指的是间隔为 2 的相邻素数
- 1、当 n>=6,n-1 和n+1 为孪生素数,那么 n 一定是6的倍数
- 2.素数的分布规律:当 n>=5时,如果n为素数,那么 n%6=1∣∣n%6=5,即n一定出现在6x(x≥1)两侧。(就是说大于等于5的素数一定是分布在6倍数的左右两侧,但在6倍数左右两侧的数不一定是素数)
代码:
public static boolean isP(int num) {
if (num <= 3) {
return num > 1;
}
if (num % 6 != 1 && num % 6 != 5) {
return false;
}
int sqrt = (int) Math.sqrt(num);
for (int i = 5; i <= sqrt; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) {
return false;
}
}
return true;
}