素数筛选法,快速获取素数序列

今天,学习了素数求取的方法,感觉很棒,拿来分享一下。首先,对比一下两种方法:普通求取素数的方法和基于筛选法的素数求取方法。

-普通方法求取素数

普通方法求取素数是根据素数的定义来判断一个数N是否为素数(只有1和它本身能够整除自己)。因此,该方法一般方式是测试1到的N所有数是否整除N,来判断N是否为素数的。代码示例如下:

#include
#include
#define N 10000001
int prime[N];

int main()
{
     int i, j, num = 0;
     for(i=2; ifor(j=2; j<=sqrt(i); j++)
             if( j%i==0 ) break;
         if( j>sqrt(i) ) prime[num++] = i;
     }
     for(i=2; i<100; i++) //只输出2-100内的素数
        if( prime[i] )printf("%d ",i);
     return 0;
}

这段代码在我的1G内存,单核CPU的云主机上,会运行相当长的时间。

-基于筛选法的素数求取方式

基于筛选法的素数求取方式:用数组的方式存取筛选候选集,根据质数的倍数不是质数,偶数不是质数的原则进行一次次筛选。但是,不知道为什么for循环的结束位置是sqrt(N)?

#include 
#include 
#define N 10000001
int prime[N];
int main()
{
   int i, j;
   for(i=2; iif(i%2) prime[i]=1;
       else prime[i]=0;
   }

   for(i=3; i<=sqrt(N); i++)
   {   if(prime[i]==1)
       for(j=i+i; j0;
   }

   for(i=2; i<100; i++)//只输出2-100内的素数
    if( prime[i]==1 )printf("%d ",i);
   printf("\n");

   return 0;
}

基于筛选法的素数求取方式,运行时间短。一部分原因是时间复杂度小,一部分原因是省去了CPU开根号占用的时间。综上,基于筛选法的素数求取方式是一个快速、实用的求取素数的方法。

另外,还可以针对基于筛选法的素数求取方式做进一步的优化。简化数组的占用空间:因为所有的偶数都不是质数(除2之外),所以数组可以只存放奇数,省掉一半的占用空间。

你可能感兴趣的:(算法)