初学者学到的素数筛可能是这个:
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; } }
懒得解释了,自己一行一行的调试看吧,我就是这么理解的。