素数筛选法

来源:互联网 发布:淘宝考试以下不是催情 编辑:程序博客网 时间:2024/06/03 20:14

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]间的非素数即可


0 0
原创粉丝点击