2022.2.23#数论之素数暴力到线性筛

2022-02-23

1.素数问题:求小于n的所有素数

      1.暴力枚举法:O(n 根号n)

n的质数的平方小于n

判断素数方法——从2到根号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;
    }
}

 

posted @ 2022-02-23 22:45  Tiachi  阅读(56)  评论(0)    收藏  举报