素数的定义

素数也叫质数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做素数;否则称为合数(规定1既不是质数也不是合数)。

一、试除法(判断素数)

试除法顾名思义就是用 2 到 n - 1 的数一个一个试除,如果 n 不能整除这之间所有的数,那么说明它就是素数。这样从 2 试到 n - 1,显然时间复杂度是的,那么有没有方法可以降低时间复杂度呢?答案是肯定有的,可以证明这个循环范围可以缩小到从 2 到 ,那么时间复杂度就缩短到了

再对循环式子进行稍微的变形,C++代码如下:

bool is_prime(int n)
{if(n < 2) return false;for(int i = 2; i <= n / i; i++)   // 这里用 i <= n / i 或 i * i <= n 比 i <= sqrt(n)要好if(n % i == 0)return false;return true;
}

二、埃氏筛法(求一个范围中的所有素数)

试除法的弊端非常明显,如果要求一个范围中的所有素数,用试除法一个一个判断效率就太低了。

埃氏筛法是用于解决这类问题的古老而简单高效的方法,可以快速找到[2, n]中的所有素数。

具体操作是这样的:从2开始寻找素数,每次找到一个素数后就将它的倍数全部筛掉,并将该素数存储到另一个队列(数组)中,不断循环,直至原队列(数组)为空。

时间复杂度为

C++代码如下:

int primes[N], cnt;   // primes[]存储所有素数
bool st[N];   // st[x]存储x是否被筛掉void E_sieve(int n){for(int i = 2; i <= n / i; i++){if(!st[i]){primes[cnt++] = i;for(int j = 2 * i; j <= n; j += i)   // 这里可以优化成 int j = i * ist[j] = true;}}
}

三、欧拉筛法(埃氏筛法的优化版)

埃氏筛法中,由于一个数可以既是一个素数的倍数,又是另一个素数的倍数,可以发现这会出现重复标记的情况,即同一个数被筛掉了不止一次,浪费操作了。

欧拉筛法就是在埃氏算法的基础上多了判断的步骤,从而消去了这种重复标记的情况,核心思路是用合数中的一个因数筛掉这个合数。

具体操作为:利用已经求得的素数,第一重循环将区间内的数从小到大遍历,第二重循环将已求得的素数从小到大遍历,将这个数和素数的乘积标记为合数。如果一个数能被素数整除,跳出循环。

时间复杂度为

C++代码如下:

int primes[N], cnt;   // primes[]存储所有素数
bool st[N];   // st[x]存储x是否被筛掉void Euler_seive(int n){for(int i = 2; i <= n; i++){if(!st[i]) primes[cnt++] = i;for(int j = 0; primes[j] <= n / i; j++){st[primes[j] * i] = true;if(i % primes[j] == 0) break;   // 如果这个数能被素数整除,跳出循环}}
}

【数论】求素数的三种方法相关推荐

  1. 求最小公倍数的三种方法(C语言)

    求最小公倍数的三种方法 1.常规暴力求解法 2.辗转相除法 3.迭乘法 //1.常规暴力求解法 #include <stdio.h> int main() {int a = 0;int b ...

  2. java中隐函数求导法则_隐函数求导的三种方法

    this.p={ m:2, b:2, loftPermalink:'', id:'fks_085075084086088070081083074065081087082066093087080', b ...

  3. C语言求最大公约数三种方法详解

    C语言求最大公约数三种方法详解 题目要求 常用写法(穷举法) 辗转相减法 辗转相除法 main函数 整体代码 题目要求 运行最大公约数的常用算法,并进行程序的调式与测试. 常用写法(穷举法) 从两个数 ...

  4. python求平方根的三种方法

    python求平方根的三种方法 题干描述 题目解答 题干描述 没啥好说的qwq,求根号下x,并舍弃小数部分,只保留整数 题目解答 方法一:不多bb,直接0.5次方(这应该是最没有营养的解法,面试官估计 ...

  5. php判断质数,php如何判断是否为素数?判断素数的三种方法(代码示例)

    本篇文章给大家带来的内容是介绍php如何判断是否为素数?判断素数的三种方法(代码示例).有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 什么是素数? 质数又称素数.一个大于1的自然数 ...

  6. 求素数的几种方法(通俗易懂)

    博主简单的写下这篇文章,主要为了更好地复习和理解,希望对各位有帮助. 素数:指一个只能被1和它本身整除的数. 青铜级别求素数:枚举范围内的每个数在2到本身的范围中是否有被整除的数.没有就是素数,有就不 ...

  7. C语言求幂的三种方法

    用三种方法求幂值 一. 暴力递归 直接对x乘y次 int result(int x,int y) {int num=1;for (int i=1; i<=y; i++) {num*=x;}ret ...

  8. c语言程序π,C语言求圆周率π(三种方法)

    题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止. 题目2) 根据公式②,用前100项之积计算π的值. 题目1)提供了一种解法,题目2)提供了两种解法,请看解析. 题目1) ...

  9. c语言求圆周率 . 4,C语言求圆周率π(三种方法)(4页)-原创力文档

    C语言求圆周率π(三种方法) 题目1) 利用公式①计求π的近似值,要求累加到最后一项小于10^(-6)为止.题目2) 根据公式②,用前100项之积计算π的值.题目1)提供了一种解法,题目2)提供了两种 ...

最新文章

  1. Hey!你的 CSDN 年度报告已出炉,请查收~
  2. python如何并发上千个get_用greenlet实现Python中的并发
  3. stopImmediatePropagation函数和stopPropagation函数的区别
  4. 个人图书藏书管理系统-菜单截图
  5. 「重磅猜题之第二篇」2019年大学生电子设计竞赛
  6. js如何在当前页面加载springmvc返回的页面_手写SpringMVC学习
  7. hive表定义(3种方式)
  8. XGBoost原理与实例分析
  9. 1个通用工具平台+多个热点场景工具套件,助力开发者快速构建应用
  10. html rpc文档,HTML5 DRM 正式成为 Web 标准,百度正式开源RPC框架brpc
  11. 如何从JFrog Artifactory下载资源到本地
  12. Linux快速入门之 内存映射、共享内存(12)
  13. cpuv(cpuv2和v3有什么区别)
  14. 警惕nmn 智商税,nmn抗衰老 骗局,另有隐情
  15. JavaFX+Kotlin游戏从入门到放弃:拯救蛇蛇大作战又名454行实现几何数独游戏
  16. 程序员如何管理自己的代码
  17. java web热区链接_HTML图片热区map area的用法
  18. js使用策略模式实现表单验证
  19. MLT教程:从BXL文件导入Altium Designer原理图封装和PCB封装
  20. 揭秘交换机市场内幕,“准工业级”猫腻你中招了吗?

热门文章

  1. 各个tts的下载地址及介绍
  2. Chrome保存的HAR文件怎么打开?
  3. PYTHON游戏脚本无法正常运行常见问题解决方案
  4. 打油诗-最近有点嘴馋
  5. 完整电商项目--项目介绍(1)
  6. #Android笔记# 超级足球app 开发总结(二)—— SpannableString根据标记插入文字实现图文混排
  7. OpenCv保存图像
  8. java毕业设计学生宿舍管理系统Mybatis+系统+数据库+调试部署
  9. 微型计算机基础pdf,微型计算机的基础知识.pdf
  10. 前端网络基础-应用层HTTP协议