赞
踩
很多c++的算法都有不同的解法,本人精心挑选了最有的解法,今天就来讲一下筛法
埃氏筛的原理其实很简单,在小学五年级是也会学到这一解法。
- #include<bits/stdc++.h>
- #define int long long
- int count_ss,T;
- bool ss[2000005];
- void sushu(){
- for(int i=2;i<=2000000;i++){
- if(ss[i]){
- count_ss++;//可以顺便记录一下素数个数
- for(int j=i*2;i*j<=2000000;j+=i){
- ss[j]=0;
- }
- }
- }
- }
- signed main(){
- memset(ss,1,sizeof(ss));
- sushu();
- return 0;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
大家可以用埃氏筛做很多题,比如P8319 『JROI-4』分数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- //变量解释:vis[i]为bool类型,表示i是不是素数
- //pri[i]为int类型,表示第i个素数
- //maxn为筛法范围
- void init(){
- for (int i=2;i<MAXN;i++){
- if(!vis[i]){
- pri[++cnt]=i;
- }
- for(int j=1;j<=cnt;j++) {
- if(i*pri[j]>=MAXN)break;
- vis[i*pri[j]]=1;
- if(i%pri[j]==0){
- // i % pri[j] == 0
- // 换言之,i 之前被 pri[j] 筛过了
- // 由于 pri 里面质数是从小到大的,所以 pri[j]就是 i 的最小质因数,同时也是 i *pri[j] 的最小质因数
- // 那么再拿 pri[j + 1] 去筛,pri[j] 是 i * prime[j + 1] 的最小质因数,不符合题目要求
- break;
- }
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
记得点个关注哦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。