筛素数 [高效]
View Code
/*================================*\ | 筛素数 [1..n] \*================================*/ bool isp[MM]; int prm[MM]; int get_prime(int n) { int i,j,k=0; int s, e=(int)(sqrt(0.0+n)+1); for(i=0;i<=n;i++) isp[i]=true; prm[k++]=2; isp[0]=isp[1]=false; for(i=4;i<n;i+=2) isp[i]=false; for(i=3;i<e;i+=2) if(isp[i]) { prm[k++]=i; for(s=(i<<1), j=i*i; j<n ; j+=s) isp[j]=false; // 因为j是奇数,所以+奇数i后是偶数,不必处理! } for(; i<n ; i+=2) if(isp[i]) prm[k++]=i; return k; // 返回素数的个数 }