求素数——筛法模板&判断素数——剪枝

记个小笔记,具体思想可以参考其他大神
线性求法:

const int N=50;
int prime[N];
int a[N];
int check[N];
int tot=0;
void solve(){
    memset(check, 0, sizeof(check));
   for(int i=2;i<N;++i){
    if(!check[i]){
         prime[tot++]=i;//这里需要增加另外一个数组来存储素数,否则有错
    }
    for(int j=0;j<tot&&i*prime[j]<=N;++j){
        check[i*prime[j]]=1;
        if(i%prime[j]==0)
            break;
    }
   }
}

还有一种是判断从2到根号n,从3开始奇数去除合数,但不是线性。
判断素数

int isPrime(int n)
{
    int m=sqrt(n);
    if(n==2||n==3)
        return 1;
    if(n%6!=1&&n%6!=5)
        return 0;
    for(int i=5;i<m;i+=6){
        if(n%i==0||n%(i+2)==0)
            return 0;
    }
    return 1;
}
发布了57 篇原创文章 · 获赞 5 · 访问量 2820

猜你喜欢

转载自blog.csdn.net/qq_43520913/article/details/104633108