今天做九度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的素数,十分方便,效率高效。。。。。。。。。。。