筛素数判定素数

判定1-2^31以内的数是否是素数,比一个一个判定要高很多。

普通筛法:

 1 #include <iostream> 
 2 #include <cstdio> 
 3 #include <algorithm>  
 4 #include <cmath>  
 5 #include <cstring>  
 6 #include <map>  
 7 using namespace std;
 8 
 9 const int maxn = 1e6;
10 int vis[maxn + 1] = { 1,1 };
11 int prime[maxn + 1];
12 int cnt = 0;
13 
14 void create_prime()
15 {
16     int i, j;
17     int m = sqrt(maxn + 0.5);
18     for (i = 2; i <= m; i++)
19         if (!vis[i]) {
20             for (j = i*i; j <= maxn; j += i)
21                 vis[j] = 1;
22         }
23     for (i = 2; i <= maxn; i++)
24         if (!vis[i]) prime[cnt++] = i;
25 }
26 
27 int judge(int n)
28 {
29     if (n == 0 || n == 1) return 0;
30     for (int i = 0; prime[i] * prime[i] <=n&&i<cnt; i++) {
31         if (n%prime[i] == 0) return 0;
32     }
33     return 1;
34 }
35 
36 int main()
37 {
38     int n;
39     create_prime();
40     while (scanf("%d",&n)==1)
41     {
42         if (n == -1) break;
43         printf("%d\n", judge(n));
44     }
45     return 0;
46 }

更高效的筛:

 1 #include <cstdio>  
 2 #include <iostream>  
 3 #include <cmath>  
 4 using namespace std;
 5 
 6 #define N 50001  
 7 
 8 bool isprime[N];
 9 int prime[N], nprime;
10 
11 void doprime()
12 {
13     long long  i, j;
14     nprime = 0;
15     for (i = 0; i<N; i++)
16         isprime[i] = true;
17     isprime[1] = 0;
18     for (i = 2; i<N; i++)
19     {
20         if (isprime[i])
21         {
22             prime[++nprime] = i;
23             for (j = i*i; j<N; j += i)
24                 isprime[j] = false;
25         }
26     }
27 }
28 
29 int isp(int n)
30 {
31     if (n == 0 || n == 1) return 0;
32     int i, k = (int)sqrt(double(n));
33     for (i = 1; prime[i] <= k; i++)
34         if (n%prime[i] == 0)
35             return 0;
36     return 1;
37 }
38 
39 int main()
40 {
41     freopen("E:\\1.txt", "w", stdout);
42     doprime();
43     int n;
44     while (scanf("%d",&n)==1)
45     {
46         if (n == -1) break;
47         printf("%d\n", isp(n));
48     }
49     return 0;
50 }

 

优化的

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn = 65537;
 7 int vis[maxn + 1] = { 1,1 };
 8 int prime[maxn + 1];
 9 int cnt = 0;
10 
11 void eratosthenes()
12 {
13     int i, j;
14     int m = sqrt(maxn + 0.5);
15     for (i = 2; i <= m; i++) {
16         if (!vis[i]) {
17             for (j = i*i; j <= maxn; j+=i) vis[j] = 1;
18         }
19     }
20     for (i = 2; i <= maxn; i++)
21         if (!vis[i]) prime[cnt++] = i;
22 }
23 
24 int isp(int n)
25 {
26     if (n == 0 || n == 1) return 0;
27     int k = sqrt(n + 0.5);
28     for (int i = 0; prime[i]<=k; i++)
29         if (n%prime[i] == 0) return 0;
30     return 1;
31 }
32 
33 int main()
34 {
35     int n;
36     eratosthenes();
37     while (scanf("%d",&n)==1) {
38         if (n == -1) break;
39         printf("%d\n", isp(n));
40     }
41     return 0;
42 }

 

posted @ 2017-11-24 14:48  ╰追憶似水年華ぃ╮  阅读(207)  评论(0编辑  收藏  举报