欧拉筛素数
时间复杂度为O(n),比埃拉托色尼筛法快(埃氏筛法为 O(nloglogn)),原理是一个合数只用它最小的质因数筛去。
图表如下:
i | 素数表 | 筛去 |
---|---|---|
2 | {2} | {4} |
3 | {2,3} | {6,9} |
4 | {2,3} | {8}(不筛3*4=12,因为它有更小质因数2) |
5 | {2,3,5} | {10,15,25} |
6 | {2,3,5} | {12} |
… | … | … |
以此类推
#include <iostream>
using namespace std;
bool isprime[10000001];
int prime[5000000];
int main()
{
int n;
int k=0,j=0;
cin>>n;
for(int i=2;i<=n;i++){
isprime[i]=1;
}
for(int i=2;i<=n;i++){
if(isprime[i]==1){
prime[j]=i;
j++;
}
while(1){
if(i*prime[k]>n){
break;
}
isprime[i*prime[k]]=0;
if(i%prime[k]==0) break;
k++;
}
k=0;
}
cout<<"prime numbers:"<<endl;
for(int i=0;i<=j-1;i++){
cout<<prime[i]<<" ";
}
return 0;
}
希望对大家有帮助。