bool is_prime[N]; intEratosthenes(int n){ int p = 0; //初始化标记数组,先标记成都是素数,后面是合数就擦掉 for (int i = 0; i <= n; ++i) { is_prime[i] = 1; } is_prime[0] = is_prime[1] = 0;
for (int i = 2; i <= n; ++i) { if (is_prime[i]) { prime[p++] = i; // prime[p]是 if (i * i <= n && i*i > 0)//防溢出 //i的倍数都是合数,实际上也是i*2,i*3,但由于在2-i-1时已经处理过了, //所以接下来从i*i,i*(i+1)=i*i+i,.... for (int j = i * i; j <= n; j += i) is_prime[j] = 0; } } return p; }
只筛奇数的版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
bool is_prime[N]; intEratosthenes(int n){ int p = 0; for (int i = 0; i <= n; ++i){ is_prime[i] = 1; } is_prime[0] = is_prime[1] = 0; // i * i <= n 说明 i <= sqrt(n) //只需要筛一半 for (int i = 2; i * i <= n; ++i) { if (is_prime[i]) { prime[p++] = i;