素数筛普通筛法全解(C/C++)
前言
很多人在初学编程时都会学到筛选素数。关于素数筛,有埃氏筛法和欧拉筛,介绍这些知识的博文网上有很多,本文不再赘述。但在某些时候,我们并不需要筛选出所有素数,仅需对一个数是否为素数进行判断,此时用欧拉筛等筛法来做显得小题大做,普通筛法更适合。
因此,本文就对普通筛法进行一个相对详细的讲解,必要时会给出容易理解但并不严谨的证明,如有可以优化的地方,欢迎读者评论指正!
正文
素数普通筛这个名词可能有人没有听过,不过看代码就会理解是什么:
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++)相关推荐
- Mysterious Bacteria(唯一质因子解+素数筛)
原题目: Dr. Mob has just discovered a Deathly Bacteria. He named it RC-01. RC-01 has a very strange rep ...
- 面试官本拿求素数搞我,但被我优雅的“回击“了(素数筛)
原创公众号(希望能支持一下):bigsai 转载请联系bigsai 文章收录在github 求star 前言 现在的面试官,是无数开发者的梦魇,能够吊打面试官的属实不多,因为大部分面试官真的有那么那几 ...
- 求素数: 一般线性筛法 + 快速线性筛法
From: http://blog.csdn.net/dinosoft/article/details/5829550 素数总是一个比较常涉及到的内容,掌握求素数的方法是一项基本功. 基本原则就是题目 ...
- C++实现暴力筛、朴素素数筛、埃氏素数筛、欧拉素数筛的解法
前言:今天有身边的人在群里吐槽了一道烟台大学OJ上面的水题 然后他提出的问题是:如何开一个1000w大小的数组来存储. What?我仔细看了一眼题目,觉得问题的关键并不是数组可以开多大.而是这是一道在 ...
- 三种素数筛总结——(朴素筛,埃氏筛,线性筛)
但行好事,莫问前程. 题目背景 题目:(leetcode)204.计数质数 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 . 对于这类求解素数个数有关的题目,通常采用质数筛算法. 本文不计 ...
- 一般筛法求素数+快速线性筛法求素数
一般筛法求素数+快速线性筛法求素数 标签: 正则表达式算法优化扩展c 2010-08-22 01:28 28738人阅读 评论(8) 收藏 举报 分类: 算法学习资料(5) 版权声明:本文为博主原 ...
- 筛表合集(素数筛 欧拉函数筛 莫比乌斯函数筛)
[目录] 一.素数筛 1.素数判断 2.素数普通筛 3.素数线性筛 4.素数区间筛 二.欧拉函数筛 三.莫比乌斯函数筛 [素数筛] 1.直接判定质数 bool judgePrime( int num ...
- js系列教程10-canvas绘图全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...
- Help Hanzo(素数筛)
题意:本题就是求l~u之间有多少个素数: 分析:因为题数很大,所以不能用正常的素数筛法,只能先筛一部分,在用这些素数再筛出l~u之间的素数.本题和另一道题目很相似(传送门): 另一道题题目链接:htt ...
- Mybatis系列全解(八):Mybatis的9大动态SQL标签你知道几个?提前致女神!
封面:洛小汐 作者:潘潘 2021年,仰望天空,脚踏实地. 这算是春节后首篇 Mybatis 文了~ 跨了个年感觉写了有半个世纪 - 借着女神节 ヾ(◍°∇°◍)ノ゙ 提前祝男神女神们越靓越富越嗨森! ...
最新文章
- Socket:UDP协议小白
- 注解RequestMapping中的URI路径最前面到底需不需要加斜线?
- 保存Activity的状态
- wait(),notify(),notifyAll()进行了详细的分析介绍
- 由Google Protocol Buffer的小例子引起的g++编译问题
- 云计算如何使企业的业务受益?
- 清除SVOHOST.EXE的方法
- jdbc读取mysql时分秒yyyy-mm-dd hh:_[转]JDBC中日期时间的处理技巧
- javascript对象序列化(对象与JSON字符串的互换)
- ASP.NET 页面对象模型
- 默认是字典排序法_每日一课 | Python 进阶编程之字典的高级用法
- spring boot 打war包部署,打jar包
- Python游戏开发入门3 Pygame屏幕绘制机制
- 为驾驶安全护航,基于目标检测模型实现驾驶疲劳检测
- mui 图片预览(3)
- 谷歌表格图表 横坐标 滚动_如何将图表从Google表格同步到文档或幻灯片
- Markdown使用进阶教程
- 织梦CMS建站入门学习(二)
- 小米生态企业强力推荐的开源免费SRM采购管理平台功能介绍
- GprMax2D ——英国建筑研究机构(BRE)示例 #2