這個是經典的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 }
