线性素数打表

转自:http://blog.sina.com.cn/s/blog_787c1f7b0100s0yx.html

参考链接:
http://leonbule.blogbus.com/logs/5342169.html 
http://kmplayer.javaeye.com/blog/606352


原理:
1. 任何一个合数都可以表示成一个质数和一个数的乘积
2. 假设A是一个合数,且A = x * y,这里x也是一个合数,那么有:
       A = x * y; (假设y质数,x合数)
       x = a * b; (假设a是质数,且a < x)
 ->  A = a * b * y = a * Z (Z = b * y)
即一个合数(x)与一个质数(y)的乘积可以表示成一个更大的合数(Z)与一个更小的质数(a)的乘积
这也是理解代码中 if(i%primes[j] == 0)break;的关键
例如: 如果i = 8; 那么由于i%2 == 0; 因此对于i=8就只需要检查primes[1]即可,因为对于大于primes[1]的质数,像3,有:
        8*3 = 2*4*3 = 12*2
也就是说24(8*3=24)并不需要在8时检查,在12时才检查 

 

线性筛法 <wbr> <wbr>打素数表代码

1 #include <iostream> 
2  using namespace std;

4  const int MAX=100;
5  bool isPrime[MAX+1];
6  int total;//计数 
7  int prime[MAX+1];

9  //线性筛法寻找素数 
10  void makePrime()
11 {
12      memset(isPrime,true,sizeof(isPrime));
13      memset(prime,0,sizeof(prime));
14      for(int i=2;i<=MAX;i++)
15     {
16          if(isPrime[i]) prime[total++]=i;
17          for(int j=0; j<total && i*prime[j]<=MAX; j++)
18         {
19              isPrime[i*prime[j]]=false;
20             //i此时不是素数,只是拓展用 
21               if(i%prime[j]==0) break;
22          }
23     }
24 }
25 
26  int main()
27 {
28     makePrime();
29     for(int i=0;i<total;i++)
30    {
31         cout<<prime[i]<<" ";
32         if((i+1)%10==0) cout<<endl;
33    }
34    return 0;
35 }  

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