线性素数筛

复杂度O(n)

算法步骤

1、先初始化number数组全为true,代表每个数都为素数,(0和1手动修改为false,因为它们很明显不是素数),然后从数字2开始遍历(显然2是素数)

2、将number为true的放入prime数组中,并使下标+1,然后再遍历prime,将prime中的数的 i 倍的number改为false,减少后面的判断,注意边界条件prime * i <=n

3、注意还有一个特判条件如果prime能被i整除,即i%prime==0,我们就不再深究下去了,然后重复(2)

 

#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1e6+10;
//===================
int prime[maxn];
bool number[maxn];
int n,cnt;
void isprime(int n){    //1~n的素数
    memset(number, true, sizeof number);
    number[0]=number[1] = false;
    cnt = 0;
    for (int i = 2; i <= n; i++){
        if (number[i])
            prime[cnt++] = i;
        for (int j = 0; j < cnt&&prime[j] * i <= n; j++){
            number[prime[j] * i] = false;
            if (i%prime[j] == 0)
                break;
        }
    }
}
int main()
{
    cin >> n;
    isprime(n);
    for (int i = 0; i < cnt; i++){
        cout << prime[i] << endl;
    }
    return 0;
}
View Code

 

posted @ 2019-03-08 21:21  looeyWei  阅读(153)  评论(0)    收藏  举报