方法一:
从2遍历到根号n,如果能被整除就不是素数。注意需要特判0和1不是素数
public static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
方法二:
埃氏算法判断素数:用2到根号n的所有素数去筛选,将倍数设置为合数,存放在布尔数组中。true素数false合数
public class SieveOfAISHI_27 {
public static void main(String[] args) {
int n = 10000;
boolean[] isPrime = new boolean[n + 1];
Arrays.fill(isPrime, true);
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i * i <= n; i++) {
if (isPrime[i] == true) {
for (int j = 2; i * j <= n; j++) {
isPrime[i * j] = false;
}
}
}
int count = 0;
for (int i = 0; i <= n; i++) {
if (isPrime[i] == true) {
count++;
System.out.println(i);
}
}
System.out.println(count);
}
}
方法三:
欧拉筛法求素数:每个合数只被最小素因子筛一次(如36最小素因子2,不会在i=12时被12*3筛掉)
public static void main(String[] args) {
int max = 100;
int[] prime = new int[max]; //prime存放素数
boolean[] isp = new boolean[max]; //下标对应的数(素数的k倍)是否是合数 true代表是合数 false素数
int count = 0;
for (int i = 2; i < max; i++) { //i代表检查的数,从2到max
if (isp[i] == false) { //如果isp[i]为false,代表为素数,添加到prime中
prime[count++] = i;
}
for (int j = 0; j < count && i * prime[j] < max; j++) { //prime[j]每次和i相乘,为isp数组赋值,添加合数。
isp[prime[j] * i] = true; //j从0开始为最小素因子2,2与当前数乘积为合数
if (i % prime[j] == 0) { //当前数能整除素数,i=12时,12*2=24,12*2=36=3*18,36最小素因子为3,因此在i=18时会筛掉36,而不是在i=12时筛掉。
break;
}
}
}
for (int i = 0; i < count; i++)
System.out.println(prime[i]);
}