筛法求素数模板

#include<bits/stdc++.h>
using namespace std;
int flag[100000];
void askprime(){ flag[1]=1;//1既不是质数也不是合数 for(int i=2;i<=sqrt(100000);i++)//从1到sqrt(n) { if(flag[i]==0) { for(int j=2;i*j<=sqrt(100000);j++) { flag[i*j]=1;//打上标记 }//将素数后的倍数筛掉 } } }//筛出1~100000的素数 int main() { askprime(); for(int i=1;i<=100;i++) { if(flag[i]==0) cout<<i<<" "; } }

欧几里德筛法

 

#include<bits/stdc++.h>
using namespace std;
int prime[1005];
int isntprime[1005]={0,0};
int prime_num;
void askprime()
{
    for(int i=2;i<=1005;i++)//已知质数 
    {
        if(isntprime[i]==0)
        {
            prime[prime_num]=i;
            prime_num++;
        }
        for(int j=0;j<prime_num&&i*prime[j]<1005;j++)
        {
            isntprime[i*prime[j]]=1;//往后筛 
            if(i%prime[j]==0) break;//i第一个%到的prime[j]一定是这个合数最小的质因子 
        }
    }
}
int main()
{
    askprime();
    int a;
    cin>>a;
    if(binary_search(prime+0,prime+102,4)==true) cout<<"Yes"<<endl;//找到返回1,没找到返回0
    else cout<<"No"<<endl;

    
}//后面元素的值一定比前面元素的值大
//前面元素乘上一个比自己最小质因数大的数
//后面元素乘上一个比自己最小质因数小的数 

 

 

 

 

 

posted @ 2018-06-29 12:08  前排吃瓜  阅读(152)  评论(0编辑  收藏  举报