欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

问题描述

我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……请你计算第 2020 个质数是多少?

解决方案

当看到这种寻找质数的问题,很多人第一时间想到的便是二重循环暴力查找,如果只找前几个质数,可以使用这种暴力查找的方法。但如果要找第2020个质数,第9999个质数,这种暴力方法就不适用了。

这个时候就可以使用筛法来求质数,本文介绍的是欧拉筛法。其运用的原理是质数的倍数一定不是质数。因此将质数的倍数直接标记成合数,以达到筛选质数的目的。

同样以此为思路的还有埃氏筛法,但埃氏筛法具有缺陷:对于一个合数,有可能被筛多次,例如20 = 2*10 = 4*5。而对此进行改进,用合数的最小质因子进行筛选来确保每个合数只被筛选一次,这就是欧拉筛法。

但是具体是怎么做到每个合数只被筛选一次,我们来看下面的代码。

代码:

def ouLaShai(n):

lis = [True for  i in range(n + 1)]

#  用于筛选记录合数

lis2 = []

#  存质数

for i in  range(2, n + 1):

if lis[i]:

#  如果没有被筛选就加到Lis2

lis2.append(i)

for prime  in lis2:

if i *  prime > n:

#  保证小于n,不能超出范围

break

lis[i *  prime] = False

#  记录合数

if i %  prime == 0:

#  关键步骤,确保每个合数只被筛选一次

break

return lis2

这些代码中有一个非常关键,也是确保每个合数只被筛选一次的代码:

if i % prime == 0:

break

当i % prime == 0时,prime就是i的质因子,就有i = x(某个数) * prime。而到后面的某个质数prime2去筛i * prime2的时候,就有i * prime2 == x * prime * prime2,因而prime和prime2都是i * prime2的质因子。但由于prime< prime2,i * prime2的最小质因数就是prime而不是prime2。所以为了避免合数被重复筛选,当i % prime == 0时,就直接break。

例如:i=2筛选4,i=3筛选6和9,但到i=4的时候,prime先为2,筛掉8,但运行到I % prime == 0这一步的时候就直接break了,也就避免了再遍历prime = 3的时候筛掉12,而12是由i = 6时,prime = 2时筛掉。

能力越强,责任越大。

实事求是,严谨细致。

【where2go团队出品】

END

实习主编   |   王文星

责       编   |   雀    跃

质数c语言欧拉筛选,Python|欧拉筛法求质数相关推荐

  1. 【算法专题】筛法求质数

    筛法求质数 1. 概述 判断一个数n是否是质数,可以使用试除法,时间复杂度是O(n)O(\sqrt n)O(n​)的. 现在的问题是求1~n中的所有质数,如果一个一个判断的话,时间复杂度是O(n×n) ...

  2. 线性筛法求质数分解、欧拉函数

    普通筛法的缺点是:对于n,它的质因子有p1,p2,p3,那么n会被划掉3次. 线性筛法的核心思想是:对于n,它只被它的最小质因子p1划掉1次. 线性筛法略加变形即可用来求质数分解和欧拉函数. 求质数分 ...

  3. 埃氏筛法求质数(例如:200以内的质数)

    传统求质数 全部遍历,是否有因数可以整除 private boolean isPrime(int n){if(n < 2){return false;}if(n == 2 || n == 3 | ...

  4. 埃拉托斯特尼筛法求质数

    埃拉托斯特尼筛法:埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法.要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素 ...

  5. c语言求13为质数的代码,C语言求质数.doc

    C语言求质数 试编写一个程序,找出2->N之间的所有质数.希望用尽可能快的方法实现.[问题分析]: 这个问题可以有两种解法:一种是用"筛子法",另一种是从2->N检查, ...

  6. 用java语言求前50个素数_Java求质数的几种常用算法总结

    Java求质数的几种常用算法分析 本文实例讲述了Java求质数的几种常用算法.分享给大家供大家参考,具体如下: 1.根据质数的定义求 质数定义:只能被1或者自身整除的自然数(不包括1),称为质数. 利 ...

  7. 【素数问题】整理几种计算素数的算法,包含:两层循环,开根号法,埃氏筛选法,欧拉筛选法

    这篇文章主要介绍素数相关的算法问题,包含:两层循环判断,开根号法,埃氏筛选法,欧拉筛选法. 目录 一.什么是素数 二.素数计算几种方式 2.1.两层循环

  8. 欧拉方法python代码实现

    如有不对,请批评指正! 1. 显式Euler和隐式Euler 2. 改进的Euler 3. 龙格-库塔(Runge-Kutta) 4. 举个栗子 代码仅为了说明计算过程,并未进行优化! import ...

  9. 欧拉项目第三题之最大质数因子

    13195的质数因子有5,7,13和29. 600851475143的最大质数因子是多少? 这里可以肯定的是:1.数字很大,绝对不能暴力.2.如果这是一到OJ题,那么我们的目的就是尽量缩小这个数,减少 ...

最新文章

  1. 软件体系架构模式之三微内核体系架构
  2. Attribute 绑定、类绑定和样式绑定
  3. 软件测试的发展空间大吗
  4. python 时间time()及日期date()函数
  5. python学起来难吗-python学起来难吗
  6. shell调用python函数_shell调用python函数
  7. 网易云信携手SNH48 GROUP,打造在线追星新体验
  8. 家居灯光控制系统设计 android,基于Android的室内照明控制系统设计与实现
  9. zblog php和asp功能,ZBlog是否适合PHP或ASP?我们该如何选择?
  10. sql数据库批量插入
  11. 学习笔记:unity自带寻路(导航)系统:Nav Mesh导航网格
  12. 苹果6解锁ID锁支持ios13以下所有系统
  13. 黑客是如何监视女友出轨信息的,痛心的经历!
  14. 大话西游2人数最多服务器,大话西游2:全服最火服务器!凌烟阁人山人海遍地200级玩家...
  15. 【答题游戏】最强王者--小游戏开发解析
  16. gerrit 怎么不abandon修改提交
  17. 天堂2启动mysql就没了_单机天堂2运行不了 求助
  18. 拥抱云原生,聊聊高度解耦的密码管理解法
  19. mysql datasource property_spring配置datasource三种方式
  20. 什么叫工业4.0,这篇接地气的文章终于讲懂了(ZT)

热门文章

  1. 拼图游戏 复制粘贴一个叫lemene的人的,这个人是c++博客的用户,我不是,怕以后找不到这篇文章,所以复制粘贴了。文中最后给出了原文链接连接...
  2. 开发线程安全的Spring Web应用
  3. python requests 使用代理
  4. mysql 时间差函数 timestampdiff datediff 简介
  5. netcat nc端口监听 反向连接中断问题
  6. linux awk 多分隔符
  7. python 日志模块 logging
  8. 一系列用于Fuzzing学习的资源汇总
  9. unicode环境下用CFile读取txt的若干疑惑,该如何处理
  10. Python深入04 闭包