这个是经典的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 }

 

 

 

 

  

 

posted on 2012-09-27 08:22  pony1993  阅读(3194)  评论(3编辑  收藏  举报

View My Stats