素数筛法
Posted h404nofound
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了素数筛法相关的知识,希望对你有一定的参考价值。
参考博客: 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
以上是关于素数筛法的主要内容,如果未能解决你的问题,请参考以下文章