【素数筛法】

参考博客:  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 }

 

转载于:https://www.cnblogs.com/h404nofound/p/11345756.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值