原理
一般步骤为:
- 找到 p<=sqrt(n)的所有素数,
- 删除每个素数的倍数
代码实现
import java.util.*;
public class Eratosthenes {
/**
* 判断num是否为素数,原理是判断 2-num ,是否有数可以整除num
*
* @param num
* @return Boolean
*/
public boolean isPrime(int num) {
// p <= sqrt(num)
int endBounds = (int) Math.sqrt(num);
for (int i = 2; i <= endBounds; i++) {
if (num % i == 0) return false;
}
return true;
}
/**
* 找到所有小于num的素数
*
* @param num
* @return 小于num素数的列表
*/
public List<Integer> eratosthenes(int num) {
//1.获得小于 sqrt(num)的值,初始化了一些变量
int bounds = (int) Math.sqrt(num);
Set<Integer> primeSet = new HashSet<>(); //用来存小于 bounds 范围内的素数
Set<Integer> resultSet = new HashSet<>();// 用来存素数集的倍数的编号,之所以用集合是因为各个素数的倍数可能有重复的,集合可去重
List<Integer> resultList = new LinkedList<>();//结果集
//2.获取在 bounds 范围内的所有素数
for (int i = 2; i <= bounds; i++)
if (isPrime(i)) primeSet.add(i);
//3. 找到 每个素数的 小于 num的倍数的下标(值)
for (Integer primeTemp : primeSet)
for (int i = 2; primeTemp * i <= num; i++)
resultSet.add(i * primeTemp);
//4. 遍历从2-num,将不在resultset中的元素放到结果list里,就是去除素数的倍数的元素。
for (int i = 2; i <= num; i++) {
if (resultSet.contains(i)) continue;
resultList.add(i);
}
return resultList;
}
public static void main(String[] args) {
Eratosthenes eratosthenes = new Eratosthenes();
List<Integer> res = eratosthenes.eratosthenes(10000);
System.out.println(res);
System.out.println(res.size());
}
}