初始版本:
int prime[SIZE]; // 第i个素数
bool is_prime[SIZE]; //true表示i是素数
int slove(int n) {
int p = 0;
for(int i = 0; i <= n; i++)
is_prime[i] = true; //初始化
is_prime[0] = is_prime[1] = false; //0,1不是素数
for(int i = 2; i <= n; i++) {
if(is_prime[i]) {
prime[p++] = i; //计算素数的个数,也记录下了素数
for(int j = 2 * i; j <= n; j += i) // 除掉了i的倍数的数字
is_prime[j] = false;
}
}
return p;
}
优化后:
#include<cstdio>
const int N = 100000 + 5;
bool prime[N];
void init() {
for(int i = 2; i < N; i++) prime[i] = true;
for(int i = 2; i * i < N; i++) {//判断改成i*i<N
if(prime[i]) {
for(int j = i * i; j < N; j += i) {//从i*i开始就可以了
prime[j] = false;
}
}
}
}
int main(){
init();
}