筛选法求素数

今天做九度1040题,做关于第k个素数的问题,还自认为还简单,依旧用原来的方法来判断素数,就是依次用该数除以2一直到该数的平方根,能整除就不是的。相信该办法大家都知道,比较容易理解,但效率太低下。我每次提交都出现Time Limited Exceed。因此不得不改进求素数的算法

1、这是本来的算法:

int isPrimeNum(long num){

 int i,flag=0;
 for(i=2;i*i<=num;i++){
  if(num%i==0){
   flag=1;
   break;
  }
 }
 return flag;
}

现在用筛选法球素数,思想如下:

2、筛选法:该方法不是用来具体判断一个数是否是素数,而是用于判断一个范围内所有的素数。该方法的原理是:首先生成数组,然后从第一个开始依次标注它的倍数,然后从下一个没有被标注的开始,标注它所有的倍数,这样依次下去,最后没有被标注的都是素数。

代码如下: //筛选法

例如N=200000;下面的代码判断1-200000内的数是不是素数,
    int a[N];
 int i,j;

//先将所有的a[i]=1,表示为素数
 for(i=0;i<N;i++){
  a[i]=1;
 }
 
 //若a[i]=0,则表示i不是素数
 a[0]=0;
 a[1]=0;

//只有两个数可以表示成为i*j的形式,则一定不是素数,则a[i*j]=0;
 for(i=2;i<N+1;i++){
  for(j=2;j<N+1&&i*j<N+1;j++){
   a[i*j]=0;
  }
 }

通过上面的方法,可以筛选出1~N的素数,十分方便,效率高效。。。。。。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值