倍数筛选效率极高,但占用大量内存,可能无法应对一些内存不足的情况
当前我个人写了一个能计算100万内所有质数的代码,用时2s左右,不必占用大量内存。
所言有失,望请见谅。如有建议,务必提点
作者: U——0
如何检验一个数字j是否为质数,假如我们有j之前的所有质数集合s[ ],我们可以通过循环依次通过判断if(j%s[i]==0)来判断是否n为质数。
在是s[i]*s[i]>j时我们即可跳出循环,建一个int flag;判断是(否)j为质数0(1),以判断是否存入质数集合s[ ];用n来存储s【】的有效长度;通过不断更新质数集合,当最大质数为x时,我们能够计算出x*x之前的所有质数集合,以此循环
代码如下:
#include<stdio.h>
int s[1000000];
int main()
{
int n,flag,x; //n:有效长度 flag:是否当前数字为质数 x:循环所用变量
int i,j,sum; //i:循环所用变量 j:当前所检验是否为质数的数字 sum: 限定范围
s[0]=1;
n=1;
for(i=0,sum=1;i<7;i++)//000_000_000
{
for(j=sum,flag=1;j<sum*10;j++) //每次循环筛选出sum~10*sum之间的质数
{
if(j>s[n-1]) //防止出错
for(x=1,flag=0;x<n;x++)
{
if(s[x]*s[x]>j)break; //如果已经检验到s【x】*s【x】>当前数字j,结束循环
if(j%s[x]==0) //求余为0,说明j有因子为质数s【x】,不是质数
{
flag=1;break; //将当前数字标记为非质数
}
}
if(flag==0)s[n++]=j; //假如当前的数字为质数,更新质数集合s,以及有效长度
}
sum*=10; //完成sum~10*sum之间质数的筛选,增大sum,使sum=10*sum,进行循环计算新的sum~10*sum之间的质数
}
//for(i=0;i<n;i++)
//printf("%d ",s[i]);
printf("\n共有%d个质数\n",n); //有效长度为n即为质数个数
return 0;
}