快速求素数表——埃氏筛法与欧拉筛法
来源:互联网 发布:郭敬明作品集软件下载 编辑:程序博客网 时间:2024/06/05 03:07
原文地址:http://blog.csdn.net/hzeuhjejnj/article/details/78658865
快速求素数表——埃氏筛法与欧拉筛法
- 快速求素数表埃氏筛法与欧拉筛法
- 埃氏筛法
- 埃氏筛法原理
- 埃氏筛法时间复杂度
- 埃氏筛法代码求出1000000以内的素数并且输出n个素数
- 欧拉筛法
- 欧拉筛法原理
- 欧拉筛法时间复杂度
- 埃欧拉筛法代码求出1000000以内的素数并且输出n个素数
- 埃氏筛法
埃氏筛法
埃氏筛法原理
素数的定义:素数就是除了1和本身之外没有其他的约数,所以有约数的都不是素数。
因此,埃氏筛法的思想就是:先去掉2的倍数,再去掉3的倍数,再去掉4的倍数,……依此类推,直到最大数小于最后一个标出的素数的平方,那么剩下的序列中所有的数都是素数。
埃氏筛法时间复杂度
O(nloglogn)
时间复杂度的证明戳此链接
埃氏筛法代码【求出1000000以内的素数并且输出n个素数】
#include<iostream>#include<cstring>using namespace std;#define LENGTH 1000000int 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 700001int 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;}
阅读全文
0 0
- 快速求素数表——埃氏筛法与欧拉筛法
- 快速求素数表——埃氏筛法与欧拉筛法
- 快速筛选法求素数表
- 快速求素数算法
- 快速求素数
- 快速求素数个数
- 快速求素数模板
- 快速求素数 C语言
- 筛选法--快速求素数
- 快速求素数序列方法
- 快速求素数筛法
- 算法——求素数
- 一个快速法求素数的程序
- 快速求小于N的所有素数
- 【java学习】快速求素数的方法
- 埃氏筛法 求素数
- java专题——求素数
- 编程成长日记——求素数
- tensorflow安装记录
- c语言 坐标系的转化 数组元素顺序的变换
- Android事件触摸机制
- Python基础-高级特性-切片(Slice)
- Windows程序设计:画刷
- 快速求素数表——埃氏筛法与欧拉筛法
- Ruby 加密(md5,sha1,base64)
- Okhttp3+Rxjava+Retrofit2封装
- Redis入门
- idea搭建ssm项目
- BigDecimal类型的使用
- 存储过程的优缺点
- linux kthread
- 通过Java代码对咳嗽症状的一种简单表示(人工智能)