int primes[2000], cnt;
bool st[2000];
void Euler_seive(int n){
for(int i = 2; i <= n; i++){
if(!st[i]) primes[cnt++] = i;
for(int j = 0; i * primes[j] <= n && j < cnt; j++){
st[primes[j] * i] = true;
if(i % primes[j] == 0) break; // 如果这个数能被素数整除,跳出循环
}
}
}
i为当前判断是否为质数的数字,数组st为标记数组(标记true为合数,false为质数),先判断i是否被标记为false,如果没被标记为false则将i存到prime数组里,然后从prime数组里依次取质数,将质数的所有的倍数在st数组里标记为true(即标记为合数),循环结束的条件是当前这个i*某个素数大于了要查找的范围或者当前这个i是某个素数的一个倍数。