一个比较普通的判定方法
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 ;
}
这个算是我看到的判断素数最快的一种方法了