快速求素数表——埃氏筛法与欧拉筛法
快速求素数表——埃氏筛法与欧拉筛法
- 快速求素数表埃氏筛法与欧拉筛法
- 埃氏筛法
- 埃氏筛法原理
- 埃氏筛法时间复杂度
- 埃氏筛法代码求出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;
}
快速求素数表——埃氏筛法与欧拉筛法相关推荐
- 素数筛法详解:埃氏筛和欧拉筛
文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...
- 素数计算之埃氏筛法、欧拉筛法
埃氏筛法 int main() {const int maxNumber=200;int isPrime[maxNumber];int i;int x;for (i=0;i<maxNumber; ...
- 筛质数—(朴素筛法、埃氏筛法、欧拉筛法(线性筛法))
筛质数时首先要了解质数的定理:1~n中有 个质数 下面再来看具体算法: 1.朴素筛法: 直接把2~n-1中质数和合数的倍数都筛一遍,其代码如下所示: int primes[N],cnt=0; boo ...
- 素数筛法(传统普通、朴素筛法、埃式筛法、欧拉筛法(线性筛))
素数筛法(普通.朴素筛法.埃式筛法.欧拉筛法) 1.题目 2.分析 3.代码 传统普通 朴素筛法 朴素筛法(6.14) 埃式筛法 埃式筛法(6.14) 欧拉筛法(线性筛) 欧拉筛法(线性筛 6.14) ...
- 埃氏筛与欧拉筛(线性筛)
目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...
- 埃拉托色尼筛法和欧拉筛法
筛法 筛法的基本思想是:把从1开始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下的数中最小的数是素数,然后去掉它的倍数.依次类推,直到筛子为空时结束. 比如,要产生[2,n] ...
- 经典中的经典之——筛选法求素数(埃氏筛 | 线性筛)
题目描述 统计小于非负整数n的质数数量 浑水摸鱼之蛮力验证法 直接上代码 bool is_zen(int x) {int i = 2;while (i * i <= x) {if (x % i ...
- 信奥日记——数论(快速幂、埃氏筛、欧拉筛)
文章目录 前情提要 正文 1.快速幂 思路 代码 完整代码(包含取模) 2.埃拉托斯特尼筛法(埃氏筛) 原理 思路 代码 完整代码(求 2 到 n 之间的素数) 3.线性筛 思路 代码 完整代码 前情 ...
- 筛选质数,埃氏筛和欧拉筛(线性筛)
求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...
最新文章
- 基于MATLAB的面对对象编程(3)——事件和响应
- linux下shell脚本论文,Linux下Shell脚本编程
- 使用Moles对静态方法做UnitTest
- 计算机网络(二十)-广域网-PPP协议和HDLC协议
- Style Lessons in Clarity and Grace (11th Edition)中文翻译
- Centos 虚拟机克隆后eth0网卡打不开
- Python对象转json【包括嵌套对象转json,django的model转json】
- sim800L调试问题
- 51单片机语音跳绳计播报跳绳数目
- SUN进入RFID中间件市场 Linux版本今秋发售
- 计算机专业英语复习第四天
- Datawhale组队学习周报(第033周)
- WxPython 界面利用pubsub与线程通讯
- 关于语音特征提取(MFCC)的matlab相关函数
- 长期激励应占“一席之地” 穆穆-movno1
- 【基于arduino的esp32-cam视频监控简单使用】
- 教育学院计算机试卷答案,东北财经大学网络教育学院《计算机(高起点)》模拟试卷及答案(共4套)...
- WiFi万能钥匙龚蔚分享安全之道,打击山寨软件是场拉锯战
- 现代远程教育入学指南(石油大学)--入学篇---在线考试
- 【Kotlin 协程】协程中的多路复用技术 ① ( 多路复用技术 | await 协程多路复用 | Channel 通道多路复用 )