筛选法求素数

今天做九度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   a[i]=1;
 }
 
 //若a[i]=0,则表示i不是素数
 a[0]=0;
 a[1]=0;

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

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

你可能感兴趣的:(C语言)