素数算法
package com.jmmq.load.jim.algorithm;
/**
* 是否是素数算法
* 如果n不是素数, 则n有一个因子d满足1< d <=sqrt(n)
* 素数又叫质数,质数是指在大于1的自然数中,除了1和它本身以外,不能被其他自然数整除的数。
* 参考文档:
* https://www.zifangsky.cn/89.html
* https://blog.youkuaiyun.com/program_think/article/details/7032600
*/
public class PrimeNumberPrc {
public static void main(String[] args) {
}
/**
*
* @param x 要测试的数据
* @return
* 穷举 - 效率最低🤢
*/
public static boolean testPrimeNumber(int x){
// 大于1的自然数
if(x < 2){
return false;
}
for(int i = 2; i < x; i++ ){
if(x%i == 0){
return false;
}
}
return true;
}
/**
* @param x
* @return
*/
public static boolean testPrimeNumber1(int x){
// 小于1 && 能被2整除都不是素数(专业里面2其实也是素数。就不补充进来了主要是看思路)
if(x < 2 || x%2 == 0 ){
return false;
}
// 可分解因式都是成对出现,
// 一个在 √x 前一个在 √x后,因此循环的时候只需要循环到 √x即可
// 这里从3开始循环,因为上面过滤掉了所有偶数,所以步长就是2
for(int i = 3; i*i <= x; i = i+2){
// 这里还可以把 x%i == 0 的时候缓存下 x/i的值。
// 这样后面循环的时候判断如果是缓存中的倍数则直接就跳过,这里不写了
if(x%i == 0){
return false;
}
}
return true;
}
}