/* a[]: 用于返回素数的数组 n: 产生n以内的素数,按升序放入a[]中 返回值: n以内素数的个数 */ #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; const int MAX=250000; int prime(int a[],int n) { int i,j,k,x,num,*b; n++; n/=2; b=(int *)malloc(sizeof(int)*(n+1)*2); a[0]=2;a[1]=3;num=2; for(i=1;i<=2*n;i++) b[i]=0; for(i=3;i<=n;i+=3)//这边可能不太好理解你可以写出来跟踪下 for(j=0;j<2;j++) { x=2*(i+j)-1; if(b[x]==0) { a[num++]=x; for(k=x;k<=2*n;k+=x)//把x的倍数标记掉 b[k]=1; } } return num; } int main() { int n,a[MAX],i; cout<<"输入n"<<endl; cin>>n; int count=prime(a,n); for(i=0;i<count;i++) cout<<a[i]<<" "; cout<<endl<<"总共"<<count<<"个素数"<<endl; return 0; } 上面的方法其实其步长为6,这个规律可以多写一些数出来,然后首先把偶数和3的倍数 排去。然后i从6开始,步长为6。代码如下: int prime(int a[],int n) { int i,j,k,x,num,*b; n++; n/=2; b=(int *)malloc(sizeof(int)*(n+1)*2); a[0]=2;a[1]=3;num=2; for(i=1;i<=2*n;i++) b[i]=0; for(i=6;i<=n;i+=6) { x=i-1; while(b[x]==0) { a[num++]=x; for(k=x;k<=2*n;k+=x) b[k]=1; } x=i+1; while(b[x]==0) { a[num++]=x; for(k=x;k<=2*n;k+=x) b[k]=1; } } return num; }