//素数筛选,筛出小于等于MAXN的素数
//prime[0] 存的是素数的个数
int prime[MAXN];
void getPrime(){
memset(prime,0,sizeof(prime));
for(int i=2;i<=MAXN;++i){
if(!prime[i]) prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]*i<=MAXN;++j){
prime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000010;
bool prime[MAXN];//true表示是素数
//判断<MAXN的数是不是素数
void init()
{
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
for(int i=2;i<MAXN;i++)
{
if(prime[i])
{
if(i>MAXN/i) continue;//防止i*i溢出
for(int j=i*i;j<MAXN;j+=i)//小于i倍的已经筛过了
prime[j]=false;
}
}
}
int main()
{
init();
for(int i=0;i<=13;i++)
cout<<prime[i]<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10000;
int prime[MAXN+1];
//筛选出<=MAXN的素数
//prime[0]存的是素数的个数
void getprime()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=MAXN;i++)
{
if(!prime[i]) prime[++prime[0]]=i;
for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
getprime();
for(int i=0;i<=13;i++)
cout<<prime[i]<<endl;
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=1e7+5;
const int MAXP=7e5+5;
int vis[MAXN];//vis[i]=1(合数);vis[i]=0(1或素数)
int prime[MAXP];
//筛素数
void sieve(int n)
{
int m=(int)sqrt(n+0.5);//避免浮点误差
memset(vis,0,sizeof(vis));
for(int i=2;i<=m;++i)
{
if(!vis[i])
{
for(int j=i*i;j<=n;j+=i)
{
vis[j]=1;
}
}
}
}
//生成素数表,放在prime数组中,返回素数个数。
int gen_primes(int n)
{
sieve(n);
int c=0;
for(int i=2;i<=n;++i)
{
if(!vis[i]) prime[c++]=i;
}
return c;
}
int main()
{
int c=gen_primes(100);
for(int i=0;i<c;++i)
printf("%d: %d\n",i,prime[i]);
return 0;
}
int prime[MAXN];
bool is_prime[MAXN];
//返回n以内素数的个数
//Sieve of Eratosthenes
//复杂度O(nloglogn)
int sieve(int n)
{
int p=0;
for(int i=0;i<=n;i++) is_prime[i]=true;
is_prime[0]=is_prime[1]=false;
for(int i=2;i<=n;i++)
{
if(is_prime[i])
{
prime[p++]=i;
for(int j=2*i;j<=n;j+=i) is_prime[j]=false;
}
}
return p;
}
区间筛法:
bool is_prime[MAXL];//is_prime[i-a]=true: i是素数
bool is_prime_small[MAX_SQRT_B];
//对区间[a,b)内的整数执行筛法。
void segment_sieve(LL a,LL b)
{
for(int i=0;(LL)i*i<b;i++) is_prime_small[i]=true;
for(int i=0;i<b-a;i++) is_prime[i]=true;
for(int i=2;(LL)i*i<b;i++)
{
if(is_prime_small[i])
{
for(int j=2*i;(LL)j*j<b;j+=i) is_prime_small[j]=false;//筛[2,sqrt(b))
for(LL j=max(2LL,(a+i-1)/i)*i;j<b;j+=i) is_prime[j-a]=false;//筛[a,b)
}
}
}