关键点: 每个合数只被最小的质因数筛掉
int primes[N];
bool st[N];
int cnt = 0;
void getPrimes() {
for (int i = 2; i < N; i++) {
if (!st[i]) primes[++cnt] = i;
for (int j = 1; i * primes[j] < N; j++) {
//i的质因数肯定比primes[j]大或相等,所以就保证了primes[j]是被筛掉的合数的最小质因数
st[i * primes[j]] = true;
if (i % primes[j] == 0) break;
}
}
}
例题-质因数的个数
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int primes[N];
bool st[N];
int cnt = 0;
void getPrimes() {
for (int i = 2; i < N; i++) {
if (!st[i]) primes[++cnt] = i;
for (int j = 1; i * primes[j] < N; j++) {
st[i * primes[j]] = true;
if (i % primes[j] == 0) break;
}
}
}
int main() {
int n;
cin >> n;
getPrimes();
int k = 0;
for (int i = 1; i <= cnt; i++) {
while (n % primes[i] == 0) {
k++;
n /= primes[i];
}
}
//最后n大于1的话,说明剩余的n就是素数
cout << (n > 1 ? k + 1 : k) << endl;
return 0;
}