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 }