埃筛的作用是找素数(质数),以质数的倍数一定是合数为重心思路。
比如说 2 是质数,但 2 的倍数(除了自己)都是合数。
3 是质数,但 3 的倍数(除了自己)都是合数。
我们针对这个特性,可以用打标法实现。p[x]表示x是否为质数。
cppvoid Prime() { memset(P, true, sizeof (P)); for (int i = 2; i <= MAX; i++) { if (P[i]) { for (int k = i * 2; k <= MAX; k += i) { P[k] = false; } } } }
第二行:起初大家都是质数,后面慢慢删除。
第四行:只要这个数是质数,他的倍数就都是合数(虽然合数的倍数也是合数,但是他已经被它们的公约数标记了)。
第六行:标记合数。