欧拉筛和埃氏筛的入门例题整理

欧拉筛

输入 n(n≤100) 个不大于 100000 的整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。

  • 输入:

5
3 4 5 6 7

  • 输出:

3 5 7

代码区:

#include<cstdio>
#include<string.h>
using namespace std;
int main()
{
    int a[100000],b[100],n,cnt=0;
    cin>>n;
    int maxn[100001];
    memset(a,1,sizeof(a));
    a[0]=a[1]=0;
    for(int i=2;i<100001;i++)
    {
        if(a[i])
            maxn[cnt++]=i;
        for(int j=0;j<cnt;j++)
        {
            if(i*maxn[j]>100001)
                break;
            a[i*maxn[j]]=0;
        }
    }
    for(int i=0;i<n;i++)
    {
        cin>>b[i];
    }
    for(int j=0;j<n;j++)
    {
        if(a[b[j]])
            printf("%d ",b[j]);
    }
    return 0;
}

埃筛

小A 有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。口袋的负载量就是口袋里的所有数字之和。但是口袋的承重量有限,不能装得下总和超过 L(1≤L≤100000)的质数。给出 L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。

  • 输入:

100

  • 输出

2
3
5
7
11
13
17
19
23
9

代码区:

#include<string.h>
#include<cstdio>
using namespace std;
bool a[10000];
int L;
int main()
{
    memset(a,1,sizeof(a));
    cin>>L;
    a[0]=a[1]=0;
    for(int i=2;i<10000;i++)
    {
        if(a[i])
        {
            for(int j=2*i;j<10000;j+=i)
            {
                a[j]=0;
            }
        }
    }
    int sum=2,n=0;
    for(int i=3;sum<=L;i++)
    {
    if(a[i-1]){
            printf("%d
",i-1);
            n++;
            }
    if(a[i]) sum+=i;
    }
    printf("%d",n);
    return 0;
}
本是青灯不归客, 却因浊酒留风尘
原文地址:https://www.cnblogs.com/wit-panda/p/13334349.html