初学者学到的素数筛可能是这个:

for (int i = 2; i * i <= len;i++) {
        if(!isprime[i]) {
            for (int j = i * i; j <= len;j += i)
                isprime[j] = 1;
        }
    }

其复杂度为nlog(n)

但线性筛的复杂度可以比他更低

for (int i = 2; i <= len;i++) {
        if(!isempty[i]) {
            prime[cnt++] = i;
            isprime[i] = 1;
        }
        for (int j = 0; j < cnt && i * prime[j] <= len;j++) {
            isempty[i * prime[j]] = 1;
            if(i%prime[j] == 0)
                break;
        }
    }

懒得解释了,自己一行一行的调试看吧,我就是这么理解的。