线性筛法求素数


 

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

 

 

 

 

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM