PTA乙级【1013 数素数 (20分)】注意第四个测试点

1013 数素数 (20分) 四号测试点需注意

令 P​i表示第 i 个素数。现任给两个正整数 M≤N≤10^4,请输出 PM到 PN的所有素数。

输入格式:
输入在一行中给出 M 和 N,其间以空格分隔。

输出格式:
输出从 P​M到 PN的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。

输入样例:
5 27
输出样例:
11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

思路:套欧拉筛和埃筛(素数筛)
筛子不清楚的可以看这篇
【超级传送】

还有注意格式,十个换一行。
我写了两个一个是光埃筛的,一个是欧拉筛套埃筛的
注意第四个测试点:它是在测第10000个 第10000是等于104729所以maxx>104729
但也不能开太大 会t 埃筛的用时是O(nlognlogn) 欧拉筛用时是O(n)
代码:
第一种

#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxx 1000006   //注意
typedef long long ll;

bool num[maxx];
ll prime[maxx],x=0;

void isprime(int n)
{
    for(int i=2;i<n;i++)
    {
        if(!num[i])
            prime[x++]=i;
        for(int j=2;i*j<n;j++)
        {
            num[i*j]=true;
        }
    }
}
int main()
{
    isprime(maxx);
    ll m,n;
    scanf("%lld %lld",&m,&n);
    int k=0;
    for(int i=m-1;i<n;i++)
    {
        if(k==0)
            printf("%lld",prime[i]);
        else
            printf(" %lld",prime[i]);
            k++;
            if(k==10)
            {
                k=0;
                printf("\n");
            }
    }
    return 0;
}


第二种

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<stack>
    #include<iomanip>
    using namespace std;

    typedef long long ll;
    #define maxx 10000008 //注意
    bool num[maxx];
    int prime[maxx],x=0;
    void isprime(int n)
    {
        for(int i=2;i<n;i++)
        {
           if(!num[i])
           {
               num[x]=i;
               x++;
           }
           for(int j=2;j*i<=n;j++)
           {
               num[i*j]=true;
           }
        }
    }
    void oulasai(int n)
    {

        for(int i=2;i<=n;i++)
        {
            if(!num[i])
                prime[x++]=i;
            for(int j=0;j<x;j++)
            {
                if(i*prime[j]>n)
                    break;
                num[i*prime[j]]=true;
                if(i%prime[j]==0)
                    break;
            }
        }
    }
    int main()
    {
        int n,m;
        oulasai(maxx);
        scanf("%d %d",&n,&m);
        int k=0;
        for(int i=n-1;i<m;i++)
          {
             if(k==0)
                printf("%d",prime[i]);
             else
                printf(" %d",prime[i]);
             k++;
             if(k==10)
             {
                 k=0;
                 printf("\n");
             }
          }
          //printf("\n");
        return 0;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值