文章

7

粉丝

204

获赞

4

访问

67.9k

头像
素数筛与区间筛
数据结构
发布于2020年1月19日 09:34
阅读数 15.9k

### 埃式筛法
给定一个正整数n(n <= 1e6),请问n以内有多少个素数?

做法其实很简单,首先将2到n范围内的所有整数写在一张一维表里,其中2是最小的素数。将表中所有2的倍数划去,此时表中剩下的最小的数字是3,3无法被更小的数整除,所以3是素数。再将表中所有3的倍数划去......以此类推,如果表中剩余的最小数是m,则m就是素数,将表中所有m的倍数划去,这样反复操作,就能依次枚举n以内的素数,时间复杂度为$O(nloglogn)$
```c
int prime[MAXN];
bool is_prime[MAXN];

//返回n以内的素数个数 
int sieve(int n) {
    int p = 0;
    for (int i = 2; i <= n; ++i)
        is_prime[i] = true;
    for (int i = 2; i <= n; ++i) {
        if (is_prime[i]) {
            prime[p++] = i;
            for (int j = 2 * i; j <= n; j += i)
                is_prime[j] = false;
        }    
    }
    return p;
}
```
### 区间筛法
给定整数a和b,请问区间$[a,b)$内有多少个素数...

登录查看完整内容


登录后发布评论

1 条评论
bluesky
2020年11月24日 03:37

可用孪生素数增加步长

赞(0)