一、埃氏筛

由于传统的sqrt写法比较简单,直接进行相除看是否能整除即可,这里不想过多的介绍此种方法。大多数比赛中这种写法也只能用于判断少量数据或无需大表即可通过的题目。这里从此种埃氏筛开始介绍。

此种筛法原理即为预打表,用一个isprim[]数组去记忆每一个数字是否为质数。将小于等于数据范围的数字依次进行遍历,然后进行翻倍,将翻倍后的结果标记为合数,其余未被标记的即为质数。代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn=10000;
int isprim[maxn+5];
int main(){memset(isprim,0,sizeof isprim);//重置标记所有为都质数isprim[1]=1;//1是合数for(int i=2;i<=maxn;i++){for(int j=2;i*j<=maxn;j++){isprim[i*j]=1;//翻倍的结果是合数,其余被开头重置标记为质数}}for(int i=1;i<=15;i++){cout<<i<<" "<<(isprim[i]?"nonprim":"isprim")<<endl;}
}

由于每次都是翻倍到maxn,故复杂度为n+n/2+n/3+...+1,由数学公式推论(嗯)可得,复杂度为n*logn。此种做法因为编写速度和思考速度都比较快,如果题目没有特别强制的卡N复杂度要求可以直接利用这个进行解答,毕竟早做出来排名就能靠前一点。

二、线性筛

如果题目卡复杂度卡的特别死,知道N就需要用到此筛,在上述筛法进行一些小优化,上述筛法在将30进行标记时,会在2*15,3*10,5*6等都进行标记,浪费了速度,如果有种让所有数字都只标记一次的做法即可达到N的复杂度。

于是我们考虑每个合数都可以拆解为若干质数,所以理论上将所有质数翻倍即可找到所有合数,但是此想法依然有一定缺陷,在计算35=5*7这类数时,还是在7时算到7*5,优化但没完全优化,于是我们思考让每个合数都让其最小的质因数进行翻倍标记,即可达到效果。

在理解上述思路后,我们进行代码如何编写的思考,如果按照上述逻辑进行翻倍,我们发现在外层循环无法直接获取所有质数,即使通过边算边加的方式让质数循环硬放到外层逻也会十分难以思考,于是我们逆转思维,将倍数放在外层,内层循环我们已经得到的质数,此时质数问题解决,只剩如何让每个合数都被最小质数抛去。

我们在每次进行乘积后,进行一次i%prim[j]==0的判断,如果成立,则证明此个数字一定能被其更小的数字相乘得到,例如在外层i=10,prim[j]=3,这个情况不会出现,因为在prim[j]=2时i就已经因为除尽退出循环,所以30的重任是被i=15,prim[j]=2是筛掉的,因为10是2的倍数,所以一切能被10想成得到的合数一定也会被2相乘得到,所以在10碰到2的时候会直接终止循环退出,简化了很多无用的筛选次数,因为每个数只被筛一次,所以复杂度为N。代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=10000;
int isprim[maxn+5];
int prim[maxn+6];
int main(){memset(isprim,0,sizeof isprim);//重置标记所有为都质数isprim[1]=1;//1是合数int cnt=0;//当前找到的质数个数for(int i=2;i<=maxn;i++){if(isprim[i]==0){prim[++cnt]=i;//将算好的质数添加到prim数组}for(int j=1;i*prim[j]<=maxn&&j<=cnt;j++){isprim[i*prim[j]]=1;//翻倍的结果是合数,其余被开头重置标记为质数if(i%prim[j]==0){break;//如果此时能除尽,则证明这个数可以被更小的除掉}}}for(int i=1;i<=15;i++){cout<<i<<" "<<(isprim[i]?"nonprim":"isprim")<<endl;}//    memset(isprim,0,sizeof isprim);//重置标记所有为都质数
//    isprim[1]=1;//1是合数
//    for(int i=2;i<=maxn;i++){
//        for(int j=2;i*j<=maxn;j++){
//            isprim[i*j]=1;//翻倍的结果是合数,其余被开头重置标记为质数
//        }
//    }
//    for(int i=1;i<=15;i++){
//        cout<<i<<" "<<(isprim[i]?"nonprim":"isprim")<<endl;
//    }
}

萌新第一次发帖,欢迎指正错误

素数筛线性筛详细详解(个人总结思路超长版)相关推荐

  1. 经典中的经典之——筛选法求素数(埃氏筛 | 线性筛)

    题目描述 统计小于非负整数n的质数数量 浑水摸鱼之蛮力验证法 直接上代码 bool is_zen(int x) {int i = 2;while (i * i <= x) {if (x % i ...

  2. c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解

    <数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...

  3. top命令参数详解(linux top命令的用法详细详解)

    通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. top命令输出长这样: top命令参数详解(linux top命令的用法详细详解) 以下解析一下各个字段 ...

  4. 【人脸识别】人脸验证算法Joint Bayesian详解及实现(Python版)

    人脸验证算法Joint Bayesian详解及实现(Python版) Tags: JointBayesian DeepLearning Python 本博客仅为作者记录笔记之用,不免有很多细节不对之处 ...

  5. 2021年 第12届 蓝桥杯 第4次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  6. 2021年 第12届 蓝桥杯 第3次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  7. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  8. 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器...

    [索引页] [×××] 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器 作者:webabcd 介绍 Silverlight 2.0 ...

  9. 你是真的“C”——详解C语言实现文件版通讯录

    详解C语言实现文件版通讯录

最新文章

  1. CVPR!你凭什么收录我3篇论文!?
  2. oracle 01405 提取的值为null,ORA-01405: 提取的列值为 NULL--报错原因及解决方案
  3. 计算机辅助设计b实验目的,上海电力学院电路计算机辅助设计1--含有受控源电路辅助分析...
  4. java从Swagger Api接口获取数据工具类
  5. 电脑屏幕变黄如何调整_办公室照明设计如何避免踩坑,四个要点必须注意
  6. 简明 python 教程 书_Python简明教程是不是这本书(简明python教程书本)
  7. 更新cuda驱动10.0==>11.2
  8. GPS经纬度转84坐标系
  9. 脚本框架源码,多线程,完美框架,极限多开,随意游戏可套入,端游手游
  10. JavaScript async/await理解
  11. 【机器学习基础】泛化能力、过拟合、欠拟合、不收敛、奥卡姆剃刀原则
  12. 我的编程之路上的点滴记录【一】
  13. 磁盘分区格式(MBR分区和GPT分区)和启动引导模式(Legacy和UEFI)的关系
  14. vue 列表展开收起
  15. 每周推荐短视频:商用车实现无人驾驶的目的是什么?
  16. 做测试,你后悔过吗?
  17. pythonnumpy生成二进制流_Python 读写二进制文件 以及Numpy读写二进制文件
  18. 蓝桥杯刷题冲刺 | 倒计时17天
  19. 【R语言】第二章上机实验记录
  20. fis3不是内部或外部命令,也不是可运行的程序

热门文章

  1. ubuntu 8.10安装配置经验(Intrepid Ibex)——转载
  2. vue中实现文字超过2行... 展开-收起(兼容ie)
  3. WordPress搭建“外贸独立站”完整操作教程
  4. 大疆精灵4与双目视觉智能导航系统
  5. iOS原生封装二维码、条形码扫描工具;生成、识别(彩色)二维码、条形码图片
  6. java-php-python-ssm校园易购二手交易平台计算机毕业设计
  7. GPS接收机学习小记(一)
  8. kaggle——信用卡欺诈检测项目实战
  9. idea社区版的安装和安装中文插件
  10. VC++6.0新建C语言项目以及代码运行