a102 素数(二)筛选法 Sieve of Eratosthenes
引例
#include<bits/stdc++.h>
using namespace std;
#define N 1000500
int p[80000],a[N];
int SAI(int n){
int tot=0;
for(int i=2;i*i<=n;i++)
if(!a[i])for(int j=i*i;j<=n;j=j+i)a[j]=1;
for(int i=2;i<=n;i++)if(!a[i])p[++tot]=i;
return tot;
}
int main(){
printf("%d\n",SAI(1000000));//求1-1000000有多少个素数;78498
for(int i=1;i<=10;i++)cout<<p[i]<<endl;//显示前10个素数
return 0;
}
#include<stdio.h>
#define N 1000000
int p[N],a[N+10];
int Sieve(int n){
int i,j,tot=0;
for(i=2;i*i<=n;i++)
if(!a[i])for(j=2;i*j<=n;j++)a[i*j]=1;
for(i=2;i<=n;i++)if(!a[i])p[++tot]=i;
return tot;
}
int main(){
printf("%d %d\n",Sieve(1000000),p[3]);//求1-1000000有多少个素数;第3个素数是几?78498 5
return 0;
}
最强素数
http://vod.yysyxx.com:8080/problem.php?id=1433
#include<stdio.h>
#define N 1000000
int p[N],a[N+10];
long long s[N/10];
int Sieve(int n){
int i,j,tot=0;
for(i=2;i*i<=n;i++)
if(!a[i])for(j=2;i*j<=n;j++)a[i*j]=1;
for(i=2;i<=n;i++)if(!a[i])p[++tot]=i;
return tot;
}
int main(){
int i,b,e,n,m,len,f=0,x;
scanf("%d",&n); m=Sieve(n);
s[0]=0; s[1]=p[1];
for(i=2;i<=m;i++)s[i]=s[i-1]+p[i];
for(len=m;;len--){
for(i=len;i<=m;i++)if(s[i]-s[i-len]<=n && a[s[i]-s[i-len]]==0){e=i; f=1;}
if(f==1)break;
}
printf("%d %d\n",len,s[e]-s[e-len]);
//for(i=e-(len-1);i<=e;i++)printf("%d%c",p[i],i==e?'\n':' ');
return 0;
}
https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Computational_analysis

浙公网安备 33010602011771号