快速筛法求素数

http://blog.csdn.net/stack_queue/article/details/53560887

筛法的思想是去除要求范围内所有的合数,剩下的就是素数了,而任何合数都可以表示为素数的乘积,因此如果已知一个数为素数,则它的倍数都为合数。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAX 100000
 4 long long su[MAX], cnt;
 5 bool isprime[MAX];
 6 
 7 void prime()
 8 {
 9     cnt = 1;
10     memset(isprime, 1, sizeof(isprime));
11     isprime[0] = isprime[1] = 0;
12     for(long long i = 2; i <= MAX; i++)
13     {
14         if(isprime[i])
15         {
16             su[cnt++] = i;
17         }
18         for(long long j = i * 2; j <= MAX; j += i)
19         {
20             isprime[j] = 0;
21         }
22     }
23 }
24 
25 
26 int main()
27 {
28     prime();
29     for(long long i = 1; i < cnt; i++)
30         cout << su[i] << " ";
31     return 0;
32 }

如果只筛选小于等于素数i的素数与i的乘积,既不会造成重复筛选,又不会遗漏。时间复杂度几乎是线性的。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAX 100000
 4 bool isprime[MAX];
 5 long long su[MAX], cnt;
 6 
 7 void prime()
 8 {
 9     cnt = 1;
10     memset(isprime, 1, sizeof(isprime));//初始化认为所有数均为素数
11     isprime[0] = isprime[1] = 0;
12     for(long long i = 2; i <= MAX; i++)
13     {
14         if(isprime[i])
15             su[cnt++] = i;
16         for(long long j = 1; j < cnt && su[j] * i < MAX; j++)
17         {
18             isprime[su[j] * i] = 0;//筛掉小于等于i的素数和i的积构成的合数
19         }
20     }
21 }
22 
23 int main()
24 {
25     prime();
26     for(long long i = 1; i < cnt; i++)
27         cout << su[i] << " ";
28     return 0;
29 }
原文地址:https://www.cnblogs.com/CZT-TS/p/8401012.html