判断是不是素数
//缩小数据范围的暴力算法
bool isPrime(int x)
{
bool isPrime = true;
if (x == 1 || (x%2 == 0 && x != 2))
{
isPrime = false;
}
for (int i = 3; i <= sqrt(x); i+=2)
{
if (x%i == 0)
{
isPrime = false;
break;
}
}
return isPrime;
}
//用欧拉筛求n之前的素数(时间复杂度:O(n))
vector<int> EulerPrime(const int& n) {
//isPrime[i]表示i是不是素数, 先全部标记为素数
vector<bool> isPrime(n, true);
//现在已经筛出的素数列表
vector<int> primes;
primes.reserve(int(n/2));
//1不是素数
isPrime[1] = false;
for (int i = 2; i < n; ++i) {
//如果i没有被前面的数筛掉,则i是素数
if (isPrime[i]) {
primes.emplace_back(i);
}
// j循环枚举现在已经筛出的素数
// 筛掉i的素数倍,即i的prime[j]倍
for (int j = 0; j < primes.size() && i * primes[j] < n; ++j) {
// 倍数标记为合数,也就是i用prime[j]把i * prime[j]筛掉了
isPrime[i * primes[j]] = false;
// 最关键的只标记一次
// 这样可以保证线性的时间复杂度
if (i % primes[j] == 0) {
break;
}
}
}
return primes;
}
https://blog.csdn.net/qq_43701555/article/details/89912654

浙公网安备 33010602011771号