再讲素数筛选法

来源:互联网 发布:php开源b2c商城 编辑:程序博客网 时间:2024/05/17 21:51

今天一个学弟给我看了他以前写的一个素数筛选法,本人拿来与Eratosthenes筛选法对比测试了一下,其时间复杂度应该也是nlogn,实际运行速度在10^7的时候和Eratosthenes筛选法差不多。另外与Eratosthenes优化筛选法相比,它和Eratosthenes筛选法都Eratosthenes筛选法优化筛选法要慢一点点,不能筛选10^8内素数。这个筛选法的想法也比较独特,因此拿出来大家研究学习以下。

代码如下:

#include<stdio.h>
int s[10000000];
int main()
{
int n,flag,x;
int i,j,sum;
s[0]=1;
n=1;
for(i=0,sum=1;i<7;i++)//i代表的是10的几次方
{
for(j=sum,flag=1;j<sum*10;j++)
{
if(j>s[n-1])
for(x=1,flag=0;x<n;x++)
{
if(s[x]*s[x]>j)
                    break;
if(j%s[x]==0)
                {
                    flag=1;
break;
                }
}
if(flag==0)
                s[n++]=j;
}
sum*=10;
}
for(i=1;i<n;i++)
       printf("%d ",s[i]);
printf("\n共有%d个质数\n",n-1);
return 0;
}

这个筛选法的思想和Eratosthenes筛选法差不多,只不过侧重不同,都是利用是否有素数约数判断是否是素数。Eratosthenes筛选法是利用倍数筛选,节省时间,而这个晒选法是利用10以内的素数,来判断10到100中的数是否为素数,利用100以内的素数来判断100到1000以内的数是否为素数,同时以一个数小于一个素数的平方以及合数有素数约数来判断素数节省时间。这个筛选法中的素数数组中第一个数字是一,故输出时从下标为一开始输出。

学弟这么厉害,当学长的也不能太那个啥了。。。努力,变得更强!!!


0 0