题目链接
最开始筛选素数的代码
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 900000
int 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.youkuaiyun.com/bjrxyz/article/details/8125913