c语言埃氏筛求素数,【算法杂谈】埃氏素数筛(示例代码)

【今天我们来讲讲筛子】

【埃氏筛的基本思想】

简单来说就是把不大于

00756107ad7c21dea642397601578d54.png(n为数据范围)以内的素数的倍数全都去掉,那么剩下的就是2~n之间的素数了。

【举个例子】

我们假设现在n是25。

第一步:先把2作为筛子,那么所有2的倍数都被筛掉了。

则当前序列为:2 3 5 7 9 11 13 15 17 19 21 23 25

第二步:剩下的序列中第一个素数是3,将序列中3的倍数划掉。

则当前序列为:2 3 5 7 11 13 17 19 23 25

25仍然大于3的平方,所以我们还要继续筛

现在序列中第一个素数是5,同样将序列中5的倍数划掉。

则当前序列为:2 3 5 7 11 13 17 19 23

因为23小于5的平方,跳出循环

So 最后的答案就是:2 3 5 7 11 13 17 19 23 啦

是不是很简单?

哦,忘说了,这种方法的时间复杂度是O(n log n)。

想要更快的吗,还有线性筛呢!!!

【参考代码】

#include

#include

#include

#include

#include

#include

using namespace std;

const long long maxn=10000007+10;

const long long maxp=700000;

int vis[maxn];

long long prime[maxp];

long long n;

long long gen()

{

long long m=(long long)sqrt(n+0.5);

memset(vis,0,sizeof(vis));

vis[2]=0;

for(long long i=3;i<=m;i=i+2)

{

if(!vis[i])for(long long j=i*i;j<=n;j+=i) vis[j]=1;

if(i*i>n)break;

}

long long c=1;

prime[0]=2;

for(long long i=3;i<=n;i=i+2) if(!vis[i]) prime[c++]=i;

return c;

}

int main()

{

long long c;

cin>>n;

c=gen();

for(long long i=0;i

cout<

return 0;

}

【实际应用】

找素数啊,这还用说吗???

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值