两种筛选素数的方法:埃式和欧拉筛法
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#define maxn 1050
using namespace std;
int a[maxn];
bool isprime[1000002];
int num[1000002];
//埃式筛选法 时间复杂度O(nlogn)
void is_prim(int n){
n++;
fill(isprime,isprime+n,1);
fill(num,num+n,0);
isprime[1]=0;
num[1]=0;
for(int i=2;i<n;i++){
if(isprime[i]){
num[i]=num[i-1]+1;
for(int j=2*i;j<n;j+=i){
isprime[j]=0;
}
}
else{
num[i]=num[i-1];
}
}
}
//欧拉筛法O(n)
vector<int> Prime(int n){
bool flag[n+1];//judge whether the number is prime(1 represent a prime,0 represent a non-prime
fill(flag,flag+n+1,1);
vector<int> prime;
int cnt=0;//the total number of primes
for(int i=2;i<=n;i++){
if(flag[i]){
prime.push_back(i);
cnt++;
}
for(int j=0;j<cnt;j++){//保证每个素数筛掉最小的合数
if(i*prime[j]>n) break;
flag[i*prime[j]]=0;
if(i%prime[j]==0) break;//exclude the non-prime number which is not minimum
}
}
return prime;
}
本文介绍两种高效的素数筛选方法:埃氏筛法和欧拉筛法。埃氏筛法的时间复杂度为O(nlogn),通过标记合数来找出素数;欧拉筛法优化了筛选过程,达到O(n)的时间复杂度,更适用于大规模数据处理。
950

被折叠的 条评论
为什么被折叠?



