2022.2.23#数论之素数暴力到线性筛
2022-02-23
1.素数问题:求小于n的所有素数
1.暴力枚举法:O(n 根号n
n的质数的平方小于n
for (int i = 2;i * i <= j;i++) if (j % i == 0) flag = 1;
2.筛法求素数:O(n logn)
素数的倍数不是素数
判断素数方法——从2开始,当前素数的倍数删去,下一个必为素数,如此前进。
存在优化空间:对75,素数3和5都会筛除它,存在重复性。
for (int i = 2;i <= n;i++) { if (book[i] == 0) { prime[++cnt] = i; for (int j = 1;j * i <= n;j++) book[j * i] = 1; } }
3.线性筛:O(n)
每一个合数只能被最小的素数筛到
优化在于使用线性单程,对于每个数判断,若为素数,则将 素数【1】~本身 倍数的合数筛去;若为合数,则将 素数【1】~素数【cnt】(小于该合数) 倍数的合数筛去
for (int i = 2;i <= n;i++) { if (book[i] == 0) prime[++cnt] = i; for (int j = 1;j <= cnt && prime[j] * i <= n;j++) { book[prime[j] * i] = 1; if (prime[j] % i == 0) break; } }