码迷,mamicode.com
首页 > 其他好文 > 详细

【素数筛法】

时间:2019-08-13 15:29:57      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:进一步   http   prime   清除   break   遍历   int   并且   eof   

参考博客:  https://www.cnblogs.com/Duahanlang/p/3212323.html

 

1.遇见素数时将该素数的倍数都筛掉

//缺陷是会重复筛选有不同素数因子的合数 如 10=2*5 ,将被筛两次

 1 void isprime1(){
 2     memset(vis,0,sizeof(vis));
 3     int cnt = 0;
 4     for(int i = 2;i < n;++i){
 5         if(!vis[i]){
 6             prime[cnt++] = i;
 7         for(int j = i*2;j <n;j+=i) vis[j] = 1;
 8         }
 9     }
10 }

 

2.线性筛法 当i遍历到为前面已经存储的素数的倍数时跳出循坏

 1 void isprime2(){
 2     memset(vis,0,sizeof(vis));
 3     int cnt = 0;
 4     for(int i = 2;i < n;++i){
 5         if(!vis[i]) prime[cnt++] = i;
 6         for(int j = 0;j <cnt&&i*prime[j]<n;++j){
 7             vis[i*prime[j]] = 1;
 8             if(i%prime[j]==0)break;
 9         }
10     }
11 }

 

3.进一步优化

//原理:不管偶数 排除2 并且给4清除标记

 1 void isprime3(){
 2      memset(vis,0,sizeof(vis));
 3     int cnt = 1;
 4     prime[0] = 2;vis[4] = 1;
 5     for(int i = 3;i < n;i+=2){
 6         if(!vis[i]) prime[cnt++] = i;
 7         for(int j = 0;j <cnt&&i*prime[j]<n;++j){
 8             vis[i*prime[j]] = 1;
 9             if(i%prime[j]==0)break;
10         }
11     }
12 }

 

【素数筛法】

标签:进一步   http   prime   清除   break   遍历   int   并且   eof   

原文地址:https://www.cnblogs.com/h404nofound/p/11345756.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!