算法41 数素数

这两种筛法思路太巧妙了

埃氏筛EratosthenesEratosthenes

class Solution {
public:
    int countPrimes(int n) {
        int primes;
        vector<int> isPrime(n, 1);
        
        for (int i = 2; i < n; ++i) {
            if (isPrime[i]==1) {
                primes++;
                for(long j=i;i*j<n;j++){//直接从i^2开始
                   isPrime[i*j]=0;
                }
            }
            
            
        }
        return primes;
    }
};

线性筛

  1. 一个素数表
  2. 一个标记表
  3. 遍历标记表i
  4. 遍历素数表j
  5. 标记i*j
  6. 判断i%j0则返回上一层循环:**i/j=k;i(j.next)在i=k(j+1)时在jj标记**
class Solution {
public:
    int countPrimes(int n) {
        vector<int> primes;
        vector<int> isPrime(n, 1);
        for (int i = 2; i < n; ++i) {
            if (isPrime[i]==1) {
                primes.emplace_back(i);
                
            }
            for(auto p:primes){
                    if(i*p>=n)
                        break;
                    isPrime[i*p]=0;
                    if(i%p==0)
                        break;
            }
            
        }
        return primes.size();
    }
};

代码还可以优化

原文地址:https://www.cnblogs.com/impw/p/15763092.html