力扣204.计数质数

1、两层n循环(超时)

 1  int countPrimes(int n) {
 2         vector<bool>isPrime(n,true);
 3        int ins=0;
 4      
 5        for(int i=2;i<n;i++){
 6            for(int j=2;j<i;j++){
 7                if(i%j==0){
 8                isPrime[i]=false;
 9                break;
10                }
11            }
12        }
13        for(int i=2;i<n;i++){
14            if(isPrime[i])
15            ins++;
16        }
17        return ins;
18     }

2、n+根号n(超时)

 1  int countPrimes(int n) {
 2         vector<bool>isPrime(n,true);
 3        int ins=0;
 4      
 5        for(int i=2;i<n;i++){
 6            for(int j=2;j*j<=i;j++){
 7                if(i%j==0){
 8                isPrime[i]=false;
 9                break;
10                }
11            }
12        }
13        for(int i=2;i<n;i++){
14            if(isPrime[i])
15            ins++;
16        }
17        return ins;
18     }

3、线性筛(752ms,5%;36MB,46%)

 1  int countPrimes(int n) {
 2         vector<int>isPrime;
 3         vector<bool>flag(n,true);
 4 
 5         for(int i=2;i<n;i++){
 6             if(flag[i])
 7             isPrime.emplace_back(i);
 8 
 9             for(int j=0;j<isPrime.size()&&i*isPrime[j]<n;j++){
10                 flag[i*isPrime[j]]=false;
11                 if(i%isPrime[j]==0) break;//关键
12             }
13         }
14         return isPrime.size();
15        }

 

4、埃氏筛初(172ms,25%;10MB,63%)

 1  int countPrimes(int n) {
 2         vector<bool>isPrime(n,true);
 3        int ins=0;
 4      
 5        for(int i=2;i<n;i++){
 6            if(isPrime[i]){
 7                ins++;
 8                for(long j=(long)i*i;j<n;j+=i){
 9                    isPrime[j]=false;
10                }
11            }
12            }
13              return ins;
14        }

5、埃氏筛后(132ms,36%;10MB,62%)

 1 int countPrimes(int n) {
 2         vector<bool>isPrime(n,true);
 3         if(n<3)
 4         return 0;
 5        int ins=1;
 6     
 7        for(int i=4;i<n;i+=2){
 8            isPrime[i]=false;
 9        }
10 
11        for(int i=3;i<n;i++){
12            if(isPrime[i]){
13                ins++;
14                for(long j=(long)i*i;j<n;j+=2*i){
15                    isPrime[j]=false;
16                }
17            }
18            }
19              return ins;
20        }

 

上一篇:网络地址转File对象


下一篇:9.10Go之结构体之实例化