2016-12-10 线性筛法求素数
来源:互联网 发布:美国失业金人数数据 编辑:程序博客网 时间:2024/05/22 18:23
筛选法求素数,之前我学到的是这个版本:
这种已经非常不错的程序是求1~n之间的素数:
#include<bits/stdc++.h>
using namespace std;
bool a[50000000];
int main()
{
memset(a,1,sizeof(a));
int n;
cin>>n;
for(int i=2;i*i<=n;i++){
if(a[i]) for(int j=2;i*j<=n;j++) a[i*j]=0;
}
for(int i=2;i<n;i++) if(a[i]) cout<<i<<" ";
cout<<endl;
return 0;
}
这种方法将会比一个一个求快数十倍。
但这种方法在最劣情况下时间复杂度将高达O(n*sqrt(n)) 如果n非常大,也依旧是一大笔时间开销。
在优化中,很明显可以看出这种方法中有些合数被筛了不止一遍,有没有方法可以避免这种情况呢?
答案是肯定的,请看这个线性筛的程序:
#include<bits/stdc++.h>
using namespace std;
bool a[10000000];
int b[10000000];
int n;
void prime1(){
memset(a,1,sizeof(a));
int x=0;
for(int i=2;i<=n;i++){
if(a[i]) b[x++]=i;
int y=0;
while(y<x&&y*i<n){
a[b[y]*i] = 0;
if(i%b[y]==0) break;
y++;
}
}
for(int i=0;i<x;i++) cout<<b[i]<<" ";
cout<<endl;
}
int main()
{
cin>>n;
prime1();
return 0;
}
这个程序无论什么情况下时间复杂度将被限制在O(n) 在n非常大的情况下自然是比第一种快很多。(在n=1000时,将会快十几毫秒,但在n=10000时,将会快两倍)。
这种新的方法同时会拥有许多附加信息,这些信息可以帮助我们求欧拉函数。
- 2016-12-10 线性筛法求素数
- 线性筛法求素数
- 快速线性筛法求素数
- 线性筛法求素数
- 快速线性筛法求素数
- 线性筛法求素数
- 线性筛法求素数表
- 线性筛法求素数
- 线性筛法求素数
- 线性筛法求素数
- 线性筛法求素数【Template】
- 线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 一般筛法求素数+快速线性筛法求素数
- 2016-12-10 dfs简单总结
- Backpack VI
- 2016-12-10 二分法简单总结
- Cloudera 公司研发工程师,Kudu 发明人Todd Lipcon:Kudu,Storage for Fast Analytics on fast Data
- PV、UV、IP分别是什么意思
- 2016-12-10 线性筛法求素数
- dingyeye loves stone
- VLC一--零阶指数哥伦布码解码原理和实现
- poj 1704 Georgia and Bob (阶梯博弈)
- Druid (大数据实时统计分析数据存储)
- java中通过Servlet实现文件下载
- 《零点起飞学C语言(康莉)》读书笔记五
- 2016-12-7 关于欧拉函数
- Tv App Develop of OAD Architecture