试除法判断质数
时间复杂度
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;
}
}
}