素数(Prime)
素数的判断:
1 #include<math.h> 2 bool IsPrime(int n) 3 { 4 if(n <= 1) 5 return false; 6 int sqr = (int)sqrt(1.0*n); 7 for(int i=2; i<=sqr; i++) 8 if(n%i==0) return false; 9 return true; 10 }
获取素数表:
1 const int M=101; 2 vector<int> prime; 3 bool isPrime[M]={0}; 4 5 void FindPrime() 6 { 7 for(int i=1; i<M; i++) 8 if(IsPrime(i)) 9 { 10 prime.push_back(i); 11 isPrime[i] = 1; 12 } 13 }
埃氏筛法(Eratosthenes):
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int M=101; 5 int isPrime[M]; 6 7 void Eratosthenes() 8 { 9 fill(isPrime, isPrime+M, 1); 10 isPrime[0]=0; 11 isPrime[1]=0; 12 for(int i=2; i<M; i++) 13 if(isPrime[i] == 1) 14 { 15 printf("%d ", i); 16 for(int j=2*i; j<M; j+=i) 17 isPrime[j] = 0; 18 } 19 20 } 21 22 int main() 23 { 24 Eratosthenes(); 25 return 0; 26 }
- 时间复杂度:O( Nlog(logN) )
- 第一个测出地球周长的男人-。-
欧氏筛法(Euler):
1 #include<cstdio> 2 #include<vector> 3 using namespace std; 4 const int M=110; 5 int isPrime[M]; 6 7 void Euler() 8 { 9 fill(isPrime, isPrime+M, 1); 10 isPrime[0]=0; 11 isPrime[1]=0; 12 vector<int> prime; 13 for(int i=2; i<M; i++) 14 { 15 if(isPrime[i]) 16 { 17 prime.push_back(i); 18 printf("%d ", i); 19 } 20 for(int j=0; j<prime.size(); j++) 21 { 22 if(i*prime[j] > M) 23 break; 24 isPrime[i*prime[j]] = 0; 25 if(i%prime[j] == 0) 26 break; 27 } 28 } 29 } 30 31 int main() 32 { 33 Euler(); 34 return 0; 35 }
- 时间复杂度:O(N)
- 欧拉待过的俄法德,都曾是世界最强的国家,如果当初欧拉来中国,是不是咱们就年年ACM总冠军了-。-