素数筛

【原始】

时间复杂度O(n*sqrt(n))

bool isprime(int n)
{
	for(int i=2;i<=sqrt(n);i++)
	{
		i	return false;
	}
	return true;
}

【普通筛——埃拉托斯特尼(Eratosthenes)筛法】

时间复杂度O(nloglogn)

int prime[MAX_N];
bool isprime[MAX_N];
int solve(int n)
{
	int cnt=0;
	for(int i=0;i<=n;i++)
		isprime[i]=true;
	isprime[0]=isprime[1]=false;
	for(int i=2;i<=n;i++)
	{
		if(isprime[i])
		{
			prime[p++]=i;
			for(int j=2*i;j<=n;j+=i)
				isprime[j]=false;
		}
	}
	return cnt;
}

【线性筛——欧拉Euler筛】

时间复杂度为O(n)

#define MAXN 1000000 
int prime[MAXN],v[MAXN]; 
//a[i] i 为质数则为0,否则为 1 
//prime[j] 表示第 j 个质数
int m=0;//m表示现在筛出m个质数 
void primes() 
{    
	for(int i=2;i<MAXN;i++)    
	{        
		if(v[i]==0)//如果v[i]为0,说明 i 之前没有被筛到过,i 为质数             
			prime[++m] = i;        
		for(int j = 1;j<=m;j++)//遍历小于 i 的所有质数        
		{             
			int t = prime[j]; 
			//乘起来大于MAXN就跳出循环            
			if(t*i > MAXN) 
				break;            
			v[i*t] = 1;//标记 i*prime[j] 的最小质因数是prime[j]             
			//当遇到最小的质数是i的因数时,break             
			if(i%t==0)
				break;        
		}    
	} 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2019-02-27 16:23  是妖妖灵鸭  阅读(107)  评论(0编辑  收藏  举报