素数筛选法

来源:互联网 发布:录制视频软件手机 编辑:程序博客网 时间:2024/06/06 04:01

题目链接
最开始筛选素数的代码

bool is_prime(int n ){    int sqrt_n=sqrt(n);    for(int i=2;i<sqrt_n+1;i++)    {        if(n%i==0)            return false;    }    return true;}

然后是一般的素数筛选法

#include<cstdio>#include <string>#include<iostream>#define MAX 900000int prime[900010]={1,1};using namespace std;int main(){   for(int i=2;i<MAX;i++)   {       if(!prime[i])       {           for(int j=i*2;j<=MAX;j+=i)           {               prime[j]=1;           }       }   }   int m,n;   scanf("%d%d",&m,&n);   int pi=0;   for(int k=0;k<MAX;k++)   {       if(prime[k]==0)       {           pi++;           if(pi>=m&&pi<n)           {               printf("%d",k);               if((pi-m+1)%10==0)                printf("\n");               else                printf(" ");           }           if(pi==n)           {                printf("%d",k);           break;           }       }   }   return 0;}

快速素数筛选法:
原理:对于每一个数i,乘上小于等于i的最小素因数的素数,就得到以i为最大因数的合数。

#include<iostream>using namespace std;const int Max=2000000;long long prime[Max] = {0};int k=0;int a[Max]={1,1};void init(){    for(long long i=2;i<Max;i++)    {        if(!a[i])//        prime[k++] = i;        for(long long j=0;j<k&&i*prime[j]<Max;j++)        {            a[i*prime[j]] = 1;            if(i%prime[j]==0)//                break;        }    }}int main(){    int n;    init();    while(cin>>n)    {        for(int i=0;i<n;i++)       cout<<prime[i]<<" ";        cout<<endl;    }}

参考博文链接:
http://blog.csdn.net/bjrxyz/article/details/8125913

原创粉丝点击