质数

Posted on 2023-02-23 22:04  lyc2002  阅读(15)  评论(0编辑  收藏  举报

试除法判断质数

时间复杂度

O(√n)

代码

bool is_prime(int x)
{
    if (x == 1) return false;
    for (int i = 2; i <= x / i; i++)
        if (x % i == 0)
            return false;
    return true;
}

分解质因数

时间复杂度

O(√n)

代码

void prime_factorize(int x)
{
    for (int i = 2; i <= x / i; i++)
        if (x % i == 0) {
            int s = 0;
            while (x % i == 0) {
                x /= i;
                s++;
            }
            printf("%d %d\n", i, s);
        }
    if (x > 1) printf("%d %d\n", x, 1);
    puts("");
}

线性筛质数

时间复杂度

O(n)

代码

int primes[N], cnt;
bool st[N];

void get_primes(int n)
{
    for (int i = 2; i <= n; i++) {
        if (!st[i]) primes[cnt++] = i;
        for (int j = 0; primes[j] * i <= n; j++) {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}