#include<iostream> #include<cstring> #include<algorithm> #include<cstring> using namespace std; #define N 1000010 int dp[N]; //判断数组下标代表的数是否为素数的数组 int prime[N]; //存放所有筛出来的素数 int tot; void init() //线性筛法 { tot=0; //初始化 tot从0开始递增 memset(dp,sizeof(dp),0); //dp的值初始化为0 0代表该下标的数为素数 1代表该下标的数不是素数 dp[0]=dp[1]=1; //因为素数从2开始 所以这一步不是很有必要 for(long long i=2;i<N;i++) //循环 从2到N { if(dp[i]) //如果dp[i]=1 即不是素数 则继续下一个循环 如果等于0 则往下走 continue; prime[tot++]=i; //将素数值存到prime数组里 tot从0开始 每加入一个就自增1 for(long long j=i;j*i<N;j++) //j从i开始 每次加一 dp[j*i]=1; //因为能到这一步说明i是素数,比如2 j*i 就是i的倍数 4,6,8.....虽然i是素数 但i的倍数不是 } //因为它至少有i这一个因数 所以通过循环将这些数对应的dp数组值都变成1 即不是素数 } int main() { init(); for(int i=0;i<=1000;i++) //测试 cout<<prime[i]<<" "; return 0; }