素数筛

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 int prime[1000000];
 9 int vis[1000000];
10 int normal_sieve(int n)
11 {
12     memset(vis,0,sizeof(vis));
13     int cnt=0;
14     int tmp=(int)sqrt(1.0*n);
15     for(int i=2;i<=tmp;i++)
16     {
17         if(!vis[i])
18         {
19             prime[cnt++]=i;
20             for(int j=i;j<=n;j+=i)
21                 vis[j]=1;
22         }
23     }
24     for(int i=tmp;i<=n;i++)
25         if(!vis[i])
26             prime[cnt++]=i;
27     return cnt;
28 }
29 //欧拉素数筛;
30 int Find_prime(int N)
31 {
32     int cnt=0;
33     memset(vis,0,sizeof(vis));
34     for(int i=2;i<=N;i++)
35     {
36         if(!vis[i])
37             prime[cnt++]=i;
38         for(int j=0;j<cnt;j++)
39         {
40             if(i*prime[j]>N)
41                 break;
42             vis[i*prime[j]]=1;
43             if(i%prime[j]==0)
44                 break;
45         }
46     }
47     return cnt;
48 }
49 int main()
50 {
51     int n;
52     while(scanf("%d",&n)!=EOF && n)
53     {
54         int cnt=Find_prime(n);
55         for(int i=0;i<cnt;i++)
56             printf("%d ",prime[i]);
57         printf("\n");
58 
59     }
60     return 0;
61 }

 

你可能感兴趣的:(素数筛)