对于一个数i,所有i的倍数都不是素数
求1~n的素数,将1~sqrt(n)的数的所有倍数剔除,剩下的即是素数
memset(vis, 0, sizeof(vis));
for(int i = 2; i <= n; i++){
for(int j = i*2; j <= n; j += i) vis[j] = 1;
}
循环次数少于n/2 + n/3 + n/2 + …… + n/n = O(n*logn)
有数学定理1 + 1/2 + 1/3 + …… 1/n = ln(n+1) + γ
γ ≈ 0.577218;
优化得
memset(vis, 0, sizeof(vis));
for(int i = 2; i*i <= n; i++){
if(!vis[i]){
for(int j = i*i; j <= n; j += i) vis[j] = 1;
}
}