快速求素数表——埃氏筛法与欧拉筛法

  • 快速求素数表埃氏筛法与欧拉筛法

    • 埃氏筛法

      • 埃氏筛法原理
      • 埃氏筛法时间复杂度
      • 埃氏筛法代码求出1000000以内的素数并且输出n个素数
    • 欧拉筛法
      • 欧拉筛法原理
      • 欧拉筛法时间复杂度
      • 埃欧拉筛法代码求出1000000以内的素数并且输出n个素数

埃氏筛法

埃氏筛法原理

素数的定义:素数就是除了1和本身之外没有其他的约数,所以有约数的都不是素数。
因此,埃氏筛法的思想就是:先去掉2的倍数,再去掉3的倍数,再去掉4的倍数,……依此类推,直到最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数。

埃氏筛法时间复杂度

O(nloglogn)

时间复杂度的证明戳此链接

埃氏筛法代码【求出1000000以内的素数并且输出n个素数】

#include<iostream>
#include<cstring>
using namespace std;
#define LENGTH 1000000
int is_prime[LENGTH];
int prime[LENGTH];
int main(){int n,p=1,i; memset(is_prime,0,sizeof(int)*LENGTH);is_prime[2]=0;for(i=2;i<=1000;i++){if(is_prime[i]==0){prime[p++]=i;for(int j=2*i;j<=1000000;j+=i)is_prime[j]=1;}}for(;i<=1000000;i++)if(is_prime[i]==0)prime[p++]=i;while(cin>>n){for(int i=1;i<=n;i++)cout<<prime[i]<<endl;}return 0;
} 

欧拉筛法

欧拉筛法原理

欧拉筛法的原理同埃氏筛法,只不过多了一个判断删除的过程。
首先,任何合数都能表示成多个素数的积。所以,任何的合数肯定有一个最小质因子。我们通过这个最小质因子就可以判断什么时候不用继续筛下去了。
当i是prime[j]的整数倍时(i % prime[j] == 0),i*prime[j+1]肯定被筛过,跳出循环。
因为i可以看做prime[j]某个数, i*prime[j+1]就可以看做 prime[j]某个数*prime[j+1] 。而 prime[j] 必定小于 prime[j+1],
所以 i*prime[j+1] 必定已经被 prime[j]*某个数 筛掉,就不用再做了

欧拉筛法时间复杂度

O(n)

埃欧拉筛法代码【求出1000000以内的素数并且输出n个素数】

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define LENGTH 700001
int is_prime[LENGTH];//是否是素数
int prime[LENGTH];//素数表
int pri[LENGTH];//欧拉函数表
int main() {int a, b;memset(is_prime, 0, sizeof(int)*LENGTH);memset(prime, 0, sizeof(int)*LENGTH);memset(pri, 0, sizeof(int)*LENGTH);for (int i = 2, t = 0, p = 0; i <= LENGTH; i++) {pri[i] = pri[i - 1];if (is_prime[i] == 0){prime[p++] = i;pri[i]++;}for (int j = 0; j<p&&i*prime[j] <= LENGTH; j++) {is_prime[i*prime[j]] = 1;if (i%prime[j] == 0)break;}}return 0;
}

快速求素数表——埃氏筛法与欧拉筛法相关推荐

  1. 素数筛法详解:埃氏筛和欧拉筛

    文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...

  2. 素数计算之埃氏筛法、欧拉筛法

    埃氏筛法 int main() {const int maxNumber=200;int isPrime[maxNumber];int i;int x;for (i=0;i<maxNumber; ...

  3. 筛质数—(朴素筛法、埃氏筛法、欧拉筛法(线性筛法))

    筛质数时首先要了解质数的定理:1~n中有  个质数 下面再来看具体算法: 1.朴素筛法: 直接把2~n-1中质数和合数的倍数都筛一遍,其代码如下所示: int primes[N],cnt=0; boo ...

  4. 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))

    素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...

  5. 埃氏筛与欧拉筛(线性筛)

    目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...

  6. 埃拉托色尼筛法和欧拉筛法

    筛法 筛法的基本思想是:把从1开始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下的数中最小的数是素数,然后去掉它的倍数.依次类推,直到筛子为空时结束. 比如,要产生[2,n] ...

  7. 经典中的经典之——筛选法求素数(埃氏筛 | 线性筛)

    题目描述 统计小于非负整数n的质数数量 浑水摸鱼之蛮力验证法 直接上代码 bool is_zen(int x) {int i = 2;while (i * i <= x) {if (x % i ...

  8. 信奥日记——数论(快速幂、埃氏筛、欧拉筛)

    文章目录 前情提要 正文 1.快速幂 思路 代码 完整代码(包含取模) 2.埃拉托斯特尼筛法(埃氏筛) 原理 思路 代码 完整代码(求 2 到 n 之间的素数) 3.线性筛 思路 代码 完整代码 前情 ...

  9. 筛选质数,埃氏筛和欧拉筛(线性筛)

    求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...

最新文章

  1. 基于MATLAB的面对对象编程(3)——事件和响应
  2. linux下shell脚本论文,Linux下Shell脚本编程
  3. 使用Moles对静态方法做UnitTest
  4. 计算机网络(二十)-广域网-PPP协议和HDLC协议
  5. Style Lessons in Clarity and Grace (11th Edition)中文翻译
  6. Centos 虚拟机克隆后eth0网卡打不开
  7. Python对象转json【包括嵌套对象转json,django的model转json】
  8. sim800L调试问题
  9. 51单片机语音跳绳计播报跳绳数目
  10. SUN进入RFID中间件市场 Linux版本今秋发售
  11. 计算机专业英语复习第四天
  12. Datawhale组队学习周报(第033周)
  13. WxPython 界面利用pubsub与线程通讯
  14. 关于语音特征提取(MFCC)的matlab相关函数
  15. 长期激励应占“一席之地” 穆穆-movno1
  16. 【基于arduino的esp32-cam视频监控简单使用】
  17. 教育学院计算机试卷答案,东北财经大学网络教育学院《计算机(高起点)》模拟试卷及答案(共4套)...
  18. WiFi万能钥匙龚蔚分享安全之道,打击山寨软件是场拉锯战
  19. 现代远程教育入学指南(石油大学)--入学篇---在线考试
  20. 【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )

热门文章

  1. Xiaomi Mi Notebook Air 13.3“ 2018 黑苹果efi引导文件
  2. openstack项目【day24】:KVM部署
  3. 原生JS 实现字幕滚动
  4. 如何缩小庞大的Altium Designer PCB文件
  5. github代码比对颜色介绍
  6. 【Swift初见】Swift字典
  7. FineReport学习-【01 帆软报表入门】
  8. 易用性测试及GUI常见的测试要求
  9. Java之多线程全解析
  10. 图像特征提取-Hough变换