素数快速筛选法

思路:

首先先把所有的奇数都假设为素数,偶数都为合数(除2外),剩下的奇数如果是合数的话,那么该奇数一定是某个比它小的奇数的倍数

举例:
求n以内的素数
首先把 1 3 5 7 9 11 13 15 17…假设为素数
然后从3开始一直到n 判断某个数是否为素数,如果为素数就将它依次乘以2,3…所得到的结果(不超过n)置为素数,如果该数不是素数,则不需要进行乘2,3… 因为该数的倍数 会由该数的某个素数因数判断其为合数得来。

**

代码

**

#include <bits/stdc++.h>

#define ll long long
using namespace std;

int prim[1001];
int main()
{
    int n;
    cin>>n;
    memset(prim,0,sizeof(prim));
    prim[1]=1;// 1是素数
    prim[2]=1;// 2也是素数
    for (int i=3;i<=n;i++){
        if(i%2) prim[i]=1;   //先把所有奇数的看为是素数
    }
    //奇数如果是合数 那么该奇数的因数应该是某个奇数的倍数
    //去去除奇数中的合数
    //超过sqrt(n)的数不需要再求的倍数 因为他的倍数为x 且x不超过n的话
    //则x的另一个因数会小于sqrt(n)
    for (int i=3;i<=sqrt(n);i++){
        if(prim[i]){
            for (int j=i+i;j<=n;j+=i){
                prim[j]=0;
            }
        }
    }
    for (int i=1;i<=n;i++){
        if(prim[i]) cout<<i<<" ";
    }
}






猜你喜欢

转载自blog.csdn.net/weixin_44711328/article/details/107348040
今日推荐