质数筛选

倍数筛选效率极高,但占用大量内存,可能无法应对一些内存不足的情况

当前我个人写了一个能计算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; 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值