线性筛法求素数

 

这个是经典的Eraosthenes筛法:

1 for (int i = 2; i * i < N; i++)

2 {

3     if (tag[i]) continue;

4     for (int j = i; j * j < N; j++)

5         tag[i*j] = 1;

6 }

7 for (int i = 2; i < N; i++)

8     if (!tag[i])

9         prime[tol++] = i;

 

但是Eraosthenes筛法的速度并不快,原因在于对于一个合数,这种方法会重复的标记。一种线性筛素数的方法有效的解决了这一点,代码如下:

 

 1 void get_prime()

 2 {

 3     int cnt = 0;

 4     for (int i = 2; i < N; i++)

 5     {

 6         if (!tag[i])    p[cnt++] = i;

 7         for (int j = 0; j < cnt && p[j] * i < N; j++)

 8         {

 9             tag[i*p[j]] = 1;

10             if (i % p[j] == 0)

11                 break;

12         }

13     }

14 }

 

 

 

 

  

 

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