这个是经典的Eraosthenes筛法:
1 for (int i = 2; i * i < N; i++) 2 { 3 if (tag[i]) continue; 4 for (int j = i; j * j < N; j++) 5 tag[i*j] = 1; 6 } 7 for (int i = 2; i < N; i++) 8 if (!tag[i]) 9 prime[tol++] = i;
但是Eraosthenes筛法的速度并不快,原因在于对于一个合数,这种方法会重复的标记。一种线性筛素数的方法有效的解决了这一点,代码如下:
1 void get_prime() 2 { 3 int cnt = 0; 4 for (int i = 2; i < N; i++) 5 { 6 if (!tag[i]) p[cnt++] = i; 7 for (int j = 0; j < cnt && p[j] * i < N; j++) 8 { 9 tag[i*p[j]] = 1; 10 if (i % p[j] == 0) 11 break; 12 } 13 } 14 }