质数的相关问题

一个比较普通的判定方法

bool IsPrime()
{
    
    
	for(int i=2;i<=sqrt(n);i++)
	{
    
    
		if(n%2==0)
			return false;
	}
	return true;
}

Eratosthenes筛选法(质数的倍数一定不是质数)
同时对于每个x,把大于等于x的平方的x的倍数标记为合数。

void primes(int n)
{
    
    
	memset(v,0,sizeof(v));
	for(i=2;i<=n;i++)
	{
    
    
		if(v[i]) continue;
		cout<<i<<endl;
		for(j=i;j<=n/i;j++)
			v[i][j]=1;
	}
}

线性筛法
每个合数只会被它的最小质因子筛一次,时间复杂度O(n)

int v[maxn],prime[maxn];
void primes(int n)
{
    
    
	memset(v,0,sizeof(v));///最小质因子
	m=0;
	for(i=2;i<=n;i++)
	{
    
    
		if(v[i]==0)///i为质数
		{
    
    
			v[i]=i;
			prime[++m]=i;
		}
		///给当前的数i乘上一个质因子
		for(j=1;j<=m;j++)
		{
    
    
			///i有比prime[i]更小的质因子,或者超出n的范围
			if(prime[j]>v[i]||prime[j]>n/i) break;
			v[i*prime[j]]=prime[j];
		}
	}
	for(i=1;i<=m;i++)
		cout<<prime[i]<<endl;
}

还有一个在网上看到的一个判断素数的方法,这是当时ccpc的时候也用到过的一个模板。

bool isPrime( int num )
{
    
    
	//两个较小数另外处理
    if(num ==2|| num==3 )
        return 1 ;
    //不在6的倍数两侧的一定不是质数
        if(num %6!= 1&&num %6!= 5)
             return 0 ;
        int tmp =sqrt( num);
           //在6的倍数两侧的也可能不是质数
        for(int i= 5;i <=tmp; i+=6 )
             if(num %i== 0||num %(i+ 2)==0 )
                   return 0 ;
        //排除所有,剩余的是质数
        return 1 ;
}

这个算是我看到的判断素数最快的一种方法了

猜你喜欢

转载自blog.csdn.net/weixin_46434074/article/details/108826261
今日推荐