1、欧拉素数筛选法
用欧拉筛选法,可以让素数删除一次。要筛选出从1到n之间的素数,从2开始,每次将首部元素加入素数集合中,而将是首部元素倍数的数删除,为了避免重复删除,每次只是删除首部元素平方范围内的数。
具体代码如下:
public class Solution {
public List<Integer> euler_sieve(int n)
{
List<Integer> primes = new ArrayList<>();
boolean[] vis = new boolean[n + 1];
int maxn = (int)Math.sqrt(n);
for (int i = 2; i <= n; i++)
{
if (!vis[i])
{
primes.add(i);
}
int prime_size = primes.size();
for (int j = 0; j < prime_size && i * primes.get(j) < n; j++)
{
vis[i * primes.get(j)] = true;
if (i % primes.get(j) == 0) break;
}
}
return primes;
}
}
2、分段筛选法
要求[1,n]区间的素数,如果n的值很大,可以先计算[1,sqrt(n)]区间的素数,然后再删除[sqrt(n)+1,n]间的非素数即可