素数

素数又称质数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数。

求素数的方法

1. 枚举

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

2. 优化(只需判断到根号n即可)

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

3. 质数分布规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等 

bool isPrime(int n)
{
	if(n==1)
	  return false;
	if(n==2||n==3)
	  return true;
	if(n%6!=1&&n%6!=5)
	  return false;
	//在6的倍数的两侧的数也可能不是质数
	for(int i=5;i*i<=n;i+=6)
	  if(n%i==0||n%(i+2)==0)
	    return false;
	return true; 
}

4. 埃式筛选法打表  O(nlogn)

const int N=100000;
int a[N];//a[i]=0表示i是素数 
void makeatble(int n)
{
	a[0]=a[1]=1;//0,1不是素数 
	for(int i=2;i<=n;i++)
	  if(!a[i]){
	  	for(int j=i+i;j<=n;j+=i) 
	  	  a[j]=1;
	  }
} 

5.埃式筛选法中合数是作为素数的倍数被筛去的,显然,如果每个合数仅被它最小的质因子筛去,算法的效率会更高。这就是欧拉筛法

const int N=10000;
int prime[N+1]; //prime[0]存连续素数的个数,prime数组存储连续素数

void getPrime()
{
	memset(prime,0,sizeof(prime));
	for(int i=2;i<=N;i++){
		if(!prime[i])
		  prime[++prime[0]]=i;
		for(int j=1;j<=prime[0]&&prime[j]<=MAXN/i;j++){
			prime[prime[j]*i]=1;
			if(i%prime[j]==0)//如果prime[j]是i的最小质因子就跳出 
			  break;
		}
	}
 } 

6、大素数判断

Miller_Rabin算法

 

练习:

51Nod_1106 质数检测【水题】

51Nod_1181 质数中的质数(质数筛法)【筛选法】

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值