素数(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总冠军了-。-
posted @ 2019-05-12 21:31  林東雨  阅读(406)  评论(0编辑  收藏  举报