质数又称素数,一个大于1的自然数,除了1和它自身外,不能被其他自然数整除
即,质数不能表示为除了1和本身外其他自然数的乘积
不是质数的自然数称为合数(规定1既不是质数也不是合数)
目录
方法一:暴力
从 2 开始逐个检查每个数是否为质数
对于一个数,如果它不能被 2 到其平方根之间的任何数整除,则它是质数
#include <iostream>
#include <vector>
#include <cmath>
// 检查一个数是否为质数
bool isPrime(int num) {
if (num < 2) return false;
for (int i = 2; i <= std::sqrt(num); ++i) {
if (num % i == 0)
return false;
}
return true;
}
// 计算前N个质数
std::vector<int> findPrimes(int N) {
std::vector<int> primes;
int num = 2; // 从2开始检查
while (primes.size() < N) {
if (isPrime(num)) {
primes.push_back(num);
}
++num;
}
return primes;
}
方法二:埃拉托斯特尼筛法
标记合数,剩下的就是质数
从质数2开始,质数的倍数都标记为合数
#include <iostream>
#include <vector>
// 使用埃拉托斯特尼筛法计算前N个质数
std::vector<int> findPrimes(int N) {
std::vector<int> primes;
if (N <= 0) return primes;
// 估计一个上限,确保能够找到至少N个质数
int limit = N * std::log(N) + N * std::log(std::log(N));
if (limit < 2) limit = 2;
std::vector<bool> isPrime(limit + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= limit; ++i) {
if (isPrime[i]) {
primes.push_back(i);
if (primes.size() >= N) break; // 找到足够多的质数
for (int j = i * i; j <= limit; j += i) {
isPrime[j] = false;
}
}
}
return primes;
}