埃氏筛法求素数&构造素数表求素数

埃氏筛法求素数和构造素数表求素数是一个道理。

首先,列出从2开始的所有自然数,构造一个序列:

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取序列的第一个数2,它一定是素数,然后用2把序列的2的倍数筛掉:

3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一个数3,它一定是素数,然后用3把序列的3的倍数筛掉:

5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

取新序列的第一个数5,然后用5把序列的5的倍数筛掉:

7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

不断筛下去,就可以得到所有的素数。

python实现:

 1 def _odd_iter():    //    除2以外的偶数都不是素数,所以先构造一个奇数序列generator
 2     n=1
 3     while True:
 4         n = n+2
 5         yield n
 6 
 7 
 8 def _not_divisible(n):          //   定义筛选函数,将不能够整除的数筛选出来
 9     return lambda x:x%n>0
10 
11 
12 def primes():
13     yield 2
14     it = _odd_iter()   // 构造奇数序列
15     while True:
16         n = next(it)
17         yield n
18         it = filter(_not_divisible(n),it)   // 构造新序列
19 
20 for n in primes():       //  打印1000以内的素数
21     if n<1000:
22         print(n)
23     else:
24         break

C++实现

欲构造n(不包含)以内的素数表,

1.开辟isPrime[n],初始化所有元素为1,isPrime[x]为1,表示x为素数

2.令x=2

3.如果x是素数,则对于for(i=2;i*x<n;i++) 令isPrime[i*x] = 0

4.x++,如果x<n 重复3,否则结束

 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int maxNumber = 25;
 5 
 6 int main()
 7 {
 8     int isPrime[25];
 9     int i;
10     for(i =0;i<maxNumber;i++){
11         isPrime[i] = 1;
12     }     
13     for(i = 2;i<maxNumber;i++){
14         if(isPrime[i]){
15             for(int x = 2;x*i<maxNumber;x++)
16                 isPrime[x*i] = 0;  
17         }
18     }
19     for(i=2;i<maxNumber;i++){
20         if(isPrime[i])
21                 cout<<i<<"  ";
22     }
23     cout<<endl;
24     return 0;
25 }

猜你喜欢

转载自www.cnblogs.com/ll-10/p/9695799.html