前言

很多人在初学编程时都会学到筛选素数。关于素数筛,有埃氏筛法和欧拉筛,介绍这些知识的博文网上有很多,本文不再赘述。但在某些时候,我们并不需要筛选出所有素数,仅需对一个数是否为素数进行判断,此时用欧拉筛等筛法来做显得小题大做,普通筛法更适合。

因此,本文就对普通筛法进行一个相对详细的讲解,必要时会给出容易理解但并不严谨的证明,如有可以优化的地方,欢迎读者评论指正!

正文

素数普通筛这个名词可能有人没有听过,不过看代码就会理解是什么:

bool isprime(int x)
{if(x<=1) return 0;for(int i=2;i<=sqrt(x);++i)if(x%i==0) return 0;return 1;
}

现在回到本文主题:对这个筛法如何优化呢?

优化1:代码中调用了sqrt函数,可以换为 i<=x/i 来少量减少开销。这个优化对较大的数比较有效,在x比较小时,优化程度可以忽略不计。

bool isprime(int x)
{if(x<=1) return 0;for(int i=2;i<=x/i;++i)if(x%i==0) return 0;return 1;
}

优化2:这个优化代码有点长,但当x是几十万上百万的数时,优化速度就非常明显。因此这个优化适合数据范围相对较大的数据。如果x一直是几十或者几百,读者可以采用前两个,因为这样的数量级用前两个就很够了。下面先给代码,读者看代码再看证明会更好理解一点。

bool isprime(int x){if(x<=1) return 0;if(x==2||x==3) return 1;if(x%6!=1&&x%6!=5) return 0;for(int i=5;i<=x/i;i+=6)if(x%i==0||x%(i+2)==0) return 0;return 1;
}

这个优化读者可能会直接看懵了,不急,且看我细细道来。

为了方便读者保存,直接放一个图片来让读者理解,也方便读者保存。

这个细细理解就能懂的,不难,理解了之后不用背代码就能自己打出来。

不过,一定要记住这个优化是对x达到万及以上的数据优化显著,如果只是几十或者几百的数据,还是建议用最简单的判断方法来做就行。

素数筛普通筛法全解(C/C++)相关推荐

  1. Mysterious Bacteria(唯一质因子解+素数筛)

    原题目: Dr. Mob has just discovered a Deathly Bacteria. He named it RC-01. RC-01 has a very strange rep ...

  2. 面试官本拿求素数搞我,但被我优雅的“回击“了(素数筛)

    原创公众号(希望能支持一下):bigsai 转载请联系bigsai 文章收录在github 求star 前言 现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,因为大部分面试官真的有那么那几 ...

  3. 求素数: 一般线性筛法 + 快速线性筛法

    From: http://blog.csdn.net/dinosoft/article/details/5829550 素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目 ...

  4. C++实现暴力筛、朴素素数筛、埃氏素数筛、欧拉素数筛的解法

    前言:今天有身边的人在群里吐槽了一道烟台大学OJ上面的水题 然后他提出的问题是:如何开一个1000w大小的数组来存储. What?我仔细看了一眼题目,觉得问题的关键并不是数组可以开多大.而是这是一道在 ...

  5. 三种素数筛总结——(朴素筛,埃氏筛,线性筛)

    但行好事,莫问前程. 题目背景 题目:(leetcode)204.计数质数 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 . 对于这类求解素数个数有关的题目,通常采用质数筛算法. 本文不计 ...

  6. 一般筛法求素数+快速线性筛法求素数

    一般筛法求素数+快速线性筛法求素数 标签: 正则表达式算法优化扩展c 2010-08-22 01:28 28738人阅读 评论(8) 收藏 举报  分类: 算法学习资料(5)  版权声明:本文为博主原 ...

  7. 筛表合集(素数筛 欧拉函数筛 莫比乌斯函数筛)

    [目录] 一.素数筛 1.素数判断 2.素数普通筛 3.素数线性筛 4.素数区间筛 二.欧拉函数筛 三.莫比乌斯函数筛 [素数筛] 1.直接判定质数 bool judgePrime( int num ...

  8. js系列教程10-canvas绘图全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  9. Help Hanzo(素数筛)

    题意:本题就是求l~u之间有多少个素数: 分析:因为题数很大,所以不能用正常的素数筛法,只能先筛一部分,在用这些素数再筛出l~u之间的素数.本题和另一道题目很相似(传送门): 另一道题题目链接:htt ...

  10. Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!

    封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 - 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨森! ...

最新文章

  1. Socket:UDP协议小白
  2. 注解RequestMapping中的URI路径最前面到底需不需要加斜线?
  3. 保存Activity的状态
  4. wait(),notify(),notifyAll()进行了详细的分析介绍
  5. 由Google Protocol Buffer的小例子引起的g++编译问题
  6. 云计算如何使企业的业务受益?
  7. 清除SVOHOST.EXE的方法
  8. jdbc读取mysql时分秒yyyy-mm-dd hh:_[转]JDBC中日期时间的处理技巧
  9. javascript对象序列化(对象与JSON字符串的互换)
  10. ASP.NET 页面对象模型
  11. 默认是字典排序法_每日一课 | Python 进阶编程之字典的高级用法
  12. spring boot 打war包部署,打jar包
  13. Python游戏开发入门3 Pygame屏幕绘制机制
  14. 为驾驶安全护航,基于目标检测模型实现驾驶疲劳检测
  15. mui 图片预览(3)
  16. 谷歌表格图表 横坐标 滚动_如何将图表从Google表格同步到文档或幻灯片
  17. Markdown使用进阶教程
  18. 织梦CMS建站入门学习(二)
  19. 小米生态企业强力推荐的开源免费SRM采购管理平台功能介绍
  20. GprMax2D ——英国建筑研究机构(BRE)示例 #2

热门文章

  1. 项目管理十大知识领域之项目整合管理
  2. android启动序列帧动画,关于 Lottie 动画的说明及应用
  3. jquery html5自动播放,jquery html5 视频播放控制代码
  4. CorelDRAW弄什么封面都是很简单的事呢
  5. linux vi脚本,用VIM编写脚本
  6. RANSAC算法详解
  7. HLW8032在stm32f413zh上的移植(基于HAL库)
  8. vue、 echarts、iview 实现大数据可视化大屏模板
  9. mysql数据可视化 1
  10. 淘宝京东查看价格历史的chrome插件