单次复杂度为O(根号x)

一个合数(非质数)x,一定可以分解为p*q,其中p小于等于根号x,q大于等于根号x

举例:
16=2x8,2<4,8>4
8=2x4,2<3倍根号二,4>3倍根号二

通过上述性质,可以不在遍历从2~x-1,而是可以从2 ~ 根号x,这样复杂度就变为O(根号x)

为什么呢?

因为只要找到一个数的最小因数,且最小因数不为1,这样只要找到一个数也就是找到p,就可以断定这个数不是质数!

一点小优化

每次for循环遍历时,我们将i++,变为i+=2,因为只要是不为2的偶数,一定都不是质数!
(因为偶数都可以被2整除)

实现代码

#include <iostream>using namespace std;
const int maxn=1e8;
int cnt;
int isPrime(int x)
{   //特判if(x<2){return 0;}else if(x==2){return 1;}if(x%2==0) return 0;//偶数不是质素for(int i=3;i*i<=x;i+=2)//从3开始,每次+=2{if(x%i==0) return 0;}return 1;
}
int main()
{int n,x;cin>>n;//读入n个数for(int i=1;i<=n;i++){cin>>x;if(isPrime(x)) cnt++;}cout<<cnt;//输出质数个数return 0;
}

埃拉托色筛选法O(NloglogN)

埃拉托色筛选法可以帮助我们筛选出从0到n的所有质数

怎么做呢?

步骤如下

1、列举大于等于2的整数
2、留下最小的整数2,删除所有2的倍数
3、在剩下的整数中留下3,删除所有3的倍数
4、在剩下的整数中留下5,删除所有5的倍数(大于2的偶数必然不是质数,所以不用留4)
5、依次类推,留下仍未被删除的最小整数,删除该整数的倍数,直到循环结束

循环终止点为根号n

为什么是根号n?

举个例子
n=100,也就是i<=10
当i=11时,22,33,44,55,66,77,88,99都被2、3、2、5、2、7、2、3删除过了
当121时,已经大于100所以没有判断必要,我们只需要找出小于100的所有质数就可以!

复杂度

埃拉色筛选法复杂度和给出的n有关,所以它是求出n以内的所有质数的复杂度
O(根号x)是单次复杂度,如果求相同个质数,复杂度为O(n根号x)并没有埃拉托色筛选法优秀!

#include <bits/stdc++.h>using namespace std;
const int N=1e4;
bool pr[N];int main()
{int sqrtN=(int)sqrt(N);memset(pr,true,sizeof(pr));//埃拉托色尼筛选法p[0]=p[1]=false;for(int i=2;i<=sqrtN;i++){if(!pr[i]) continue;//倍数重合跳过for(int j=2*i;j<=N;j+=i)//遍历所有i的倍数{pr[j]=false;}}return 0;
}

线性筛O(n)

void get_prime(int n) {//线性筛vis[1]=1;//1不是质数for(int i=2; i<=n; i++) {if(!vis[i])prim[++cnt]=i;for(int j=1; 1ll*i*prim[j]<=n; j++) {//越界中断vis[prim[j]*i]=1;//删除if(i%prim[j]==0)break;//整除中断,因为后边没有可用的质数了}}
}

质数检验(埃拉托色筛选法、根号x复杂度算法)相关推荐

  1. MATLAB采用筛选法求质数,C/C++利用筛选法算素数的方法示例

    什么是求素数 素数指的是因子只有1和本身的数(1不是素数),求解素数在数学上应用非常广泛,而求解n以内的素数也是我们编程时常遇到的问题,在这个问题上,筛选法求解素数运行得非常快. i在2到n-1之间任 ...

  2. 堆排序算法c语言筛选法,【排序】排序算法之选择排序

    排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...

  3. 找质数算法之埃拉托色尼筛选法(Sieve of Eratosthenes算法)

    一.算法原理 一个合数总是可以分解成若干个质数的乘积,那么如果把质数(最初只知道2是质数)的倍数都去掉,那么剩下的就是质数了. 二.步骤 (1)先把1删除(1既不是质数也不是合数) (2)读取队列中当 ...

  4. 质数的后代 素数筛选法

    题目描述 在上一季里,曾提到过质数的孤独,其实从另一个角度看,无情隔膜它们的合数全是质数的后代,因为合数可以由质数相乘结合而得.  如果一个合数由两个质数相乘而得,那么我们就叫它是质数们的直接后代.现 ...

  5. java筛选法求质数_用筛选法找出N内所有素数(质数)

    //筛选法实现 // main.c #include #define ArraySize 100 int main(int argc, const char * argv[]) { int i ; i ...

  6. 经典算法-并查集、快速排序、字典序算法、二分搜索、牛顿开方法、求质数(筛选法)、编辑距离、滑动窗口、异或求重、长除法

    目录 ​​​​​​​​​​​​​​ 并查集 快速排序 字典序算法 二分搜索 开根号-牛顿开方法 求质数 编辑距离 滑动窗口 异或求重 长除法 ​​​​​​​ 并查集 并查集用于解决相同元素集合动态连接 ...

  7. c语言筛选法_极少数人用过的另类素数求解法,C语言经典算法之筛选法求质数...

    筛选求质数 明除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家努力的课题,在这边介绍一个着名的 Eratosthenes求质数方法. 行 ...

  8. python100以内孪生素数_python用递归筛选法求N以内的孪生质数(孪生素数)

    本人最近读完一本书<质数的孤独>,里面讲到孪生质数,就想查一下孪生质数的分布情况.其中主要用到了计算质数(素数)的方法,搜了一下,排名前几的都是用for循环来做的,感觉略微麻烦了一些,在比 ...

  9. 信息学奥赛一本通 2040:【例5.7】筛选法找质数 (普通筛 线性筛)

    [题目链接] ybt 2040:[例5.7]筛选法找质数 [题目考点] 1. 普通筛法找质数(埃拉托色尼筛法) 基本思想:把从2到N的一组正整数从小到大按顺序排列.从中依次删除2的倍数.3的倍数.5的 ...

最新文章

  1. 零基础参加java培训如何学习
  2. AI 一分钟 | 独角兽旷视被爆明年一季度上市;阿里达摩院再得顶级大牛,计算机理论最高奖得主马里奥加盟量子实验室
  3. 【深度学习入门到精通系列】神经网络中动量的概念
  4. HDFS副本设置——默认3
  5. 银行java多线程例子_Java 多线程 之 银行ATM实例
  6. JAVA入门级教学之(访问修饰符权限控制)
  7. flutter在2019年会有怎样的表现?
  8. linux中移动光标的命令,linux命令行中常用光标移动快捷键
  9. 02333软件工程要点及考点
  10. 需求分析与原型图设计
  11. 睡眠障碍,正在“杀死”3亿中国人
  12. 远程桌面连接方式造成键盘鼠标失效(UI自动化)
  13. 笔记本 安装Linux系统
  14. loj6198谢特 后缀数组+并查集+Trie
  15. 201711671109《Java程序设计》第九周总结(第8章)
  16. 开源终端上网行为管理服务器windows版本包的编译及运行环境搭建
  17. 从零入门 HTML、CSS、JS、React,构建 ToDo 待办事项管理项目!
  18. Python 之ConfigParser
  19. javaweb学习笔记2(jquery的使用,以及常用的方法,选择器,过滤器)
  20. 计算机杀病毒软件的应用有哪些,杀病毒软件的作用是什么?

热门文章

  1. 第一篇博客------自我介绍
  2. 惊闻女程序员公开举报:摩拜单车前端组 leader 性骚扰下属!
  3. 惊闻ci框架要被开发者放弃了 目前正在找下家脱手
  4. ffmpeg 各版本下载以及在线安装
  5. 本地安全策略命令行secedit设置本地账户安全策略
  6. Bit、Byte、KB
  7. java 将.amr音频文件转换为.mp3或.wav文件
  8. JavaScript脚本的学习
  9. 一、计算机网络概述之网络核心
  10. 【口才】谈判说服技巧及策略