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

来源:互联网 发布:中级c 程序员面试问题 编辑:程序博客网 时间:2024/06/13 22:31

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

-普通方法求取素数

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

#include<stdio.h>#include<math.h>#define N 10000001int prime[N];int main(){     int i, j, num = 0;     for(i=2; i<N; i++)     {           for(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 <stdio.h>#include <math.h>#define N 10000001int prime[N];int main(){   int i, j;   for(i=2; i<N; i++){       if(i%2) prime[i]=1;       else prime[i]=0;   }   for(i=3; i<=sqrt(N); i++)   {   if(prime[i]==1)       for(j=i+i; j<N; j+=i) prime[j]=0;   }   for(i=2; i<100; i++)//只输出2-100内的素数    if( prime[i]==1 )printf("%d ",i);   printf("\n");   return 0;}

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

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

0 0
原创粉丝点击