判断是不是素数

//缩小数据范围的暴力算法
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

https://blog.csdn.net/qaqwqaqwq/article/details/123587336

https://blog.csdn.net/m0_57071296/article/details/119873446

posted @ 2022-04-18 17:10  OXYGEN1  阅读(17)  评论(0)    收藏  举报