利用朴素筛法和埃试筛求100以内素数的个数:
package com.study.力扣.杂七杂八;
public class 素数 {
public static void main(String[] args) {
System.out.println("求100以内有多少个素数:");
System.out.println("bf:" + bf(100));
System.out.println("eratosthenes:" + eratosthenes(100));
}
//暴力搜索
public static int bf(int n) {
int count = 0;
for (int i = 2; i < n; i++) {
if (isPrime(i))
count++;
}
return count;
}
//判断n是不是素数
public static boolean isPrime(int n) {
for (int i = 2; i * i <= n; i++) {
if (n % i == 0)
return false;
}
return true;
}
//埃氏筛选法
public static int eratosthenes(int n) {
boolean[] isPrime = new boolean[n];//false代表是素数,true代表的是合数
int count = 0;
for (int i = 2; i < n; i++) {
if (!isPrime[i]) {
count++;
for (int j = i * i; j < n; j += i) { // j就是合数,标记
isPrime[j] = true;
}
}
}
return count;
}
}
欧拉筛:
欧拉筛是对埃氏筛的改进,避免重筛,提高效率
package com.study.经典算法题;
public class 欧拉筛法 {
public static void main(String[] args) {
// 建立一个bool类型的数组,以下标为要判断的数字 以该下标的值为素数的标志,
// 若i是素数 则 isPrime[i]=false
boolean[] isPrime = new boolean[101];
isPrime[0] = isPrime[1] = true;//数字0和1都不是素数,所以赋true
int[] Prime = new int[100];//存放素数的数组
int t = 0;
Prime[t++] = 2;//把2放进素数表
for (int i = 2; i < 100; i++) {
if (!isPrime[i])//若当前数是素数
Prime[t++] = i;//则存入素数数组
for (int j = 0; j < t && Prime[j] * i < 100; j++) {
isPrime[i * Prime[j]] = true;
if (i % Prime[j] == 0)
break;//避免重筛,使得程序更有效率
}
}
for (int i = 0; i < 100; i++) {
System.out.println(i + " " + isPrime[i]);
}
}
}