欧拉筛法_求素数O(n)
-
Theoretical basis:任何合数(combined number)都能表示成一系列素数(pirme number)的积。
-
Because every combined number has its own maximal prime factor(let's call it maxp),it's better to screen prime numbers by maxp.
#code by c++
#include<iostream>
#include<cstring>
using namespace std;
bool isprime[100005];
int prime[100005];
int cal; //统计运行次数
int getprime(int n)
{
int i,j,num=0;
memset(isprime,1,sizeof isprime);
for(i=2;i<=n;i++){
if(isprime[i])
prime[num++]=i;
for(j=0;j<num && i*prime[j]<=n;j++){
isprime[i*prime[j]]=false;
cal++;
if(i%prime[j]==0)
break;
}
}
return num;
}
int main(void)
{
int i,num;
num=getprime(100005);
for(i=0;i<500;i++)
cout<<prime[i]<<(i%20==0?'\n':' ');
cout<<endl<<num<<endl;
cout<<cal<<endl;
return 0;
}
#simulation
2=1 ->4=0 break;
3=1 ->6=0 9=0 break;
4=0 ->8=0 break;
5=1 ->10=0 15=0 20=0 25=0 break;
…
ps:自行参考对比
埃拉托斯特尼筛法O(nlogn)
#code c++
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int prime_count=0;
bool prime[10000];
void judgeprime(int n)
{
memset(prime,1,sizeof prime); //initialize
prime[1]=0;
for(int i=2;i<=(int)sqrt(n);i++){
if(prime[i]==1){
for(int j=i+i;j<=n;j+=i)
prime[j]=0,prime_count++;
}
}
}
int main(void) //search prime number between 0 and n
{
int n;
cout<<"Enter n:";
cin>>n;
judgeprime(n);
cout<<prime_count<<endl;
for(int i=1;i<=n;i++)
if(prime[i])
cout<<i<<' ';
return 0;
}