素数

素数即质数,是指除了1和本身之外不能被其他数整除的一类数。

素数的判定

一个整数n需要判断在2~n-1的范围内的整数是否都不能整除n,即可判断n是否为素数,反之则为非素数。如果在2~n-1中存在n的约数,不妨设为k,即n%k==0,那么由k*(n/k)==n可知,n/k也是n的一个约数,且k与n/k中一定满足其中一个小于等于\sqrt{n}、另一个大于等于\sqrt{n}。这告诉我们只需要判断n能被2,3,....,\left \lfloor \sqrt{n}\right \rfloor中的一个整除,即可判定n是否为素数。该算法时间复杂度为O\left ( \sqrt{n} \right )

代码如下:

bool isPrime(int n)
{
  if(n <= 1) return false;
  int sqr = (int)sqrt(1.0 * n);
  for(int i = 2 ;i <= sqr ;i++){
        if(n % i ==0) return false;
  }
  return true;
}
//当n没有接近int型变量上界时,简洁写法如下:
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;
}

素数表的获取

以上面方法得到的素数表的算法如下:

const int maxn = 101;
int prime[maxn],pNum = 0;
bool p[maxn] = {0};
void Find_Prime(){
  for(int i = 1; i < maxn; i++){
     if(isPrime(i) == true){
       prime[pNum++] = i;
       p[i] = true;
     }
  }
}

埃氏筛法算法如下:

const int maxn = 101;
int prime[maxn],pNum = 0;
bool p[maxn] = {0};
void Find_Prime(){
  for(int i = 2; i < maxn; i++ )
  {
    if(p[i] == false){
       prime[pNum++] = i;//如果i是素数,把素数i存到prime数组中
       for(int j = i + i; j < maxn ; j += i){//筛去所有i的倍数
         p[j] = true;
       }   
    }
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值