浏览器标题切换
浏览器标题切换end

PTA乙级1013 - 数素数 - 素数打表模板

题目

题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805309963354112

中文题。

思路

素数打表+控制格式

注意

  1. 数组直接开10e4+10,cnt开在外面的话,运行出来是错误的,但是提交是AC的,难道后台数据问题,郁闷死我了,我说怎么代码挺对,本地输出不对。可能边界上的点在不同编译器下访问存在问题。

  2. 需要注意边界上的数据,也就是如果a和b同时都给出10e4,这样子的话输出就是104729,影响开的数组的大小。所以之后写题的时候数组大小不一定要根据题意去开大10个空间,需要考虑最大的数据,根据这个数据去开,而且记录素数的数组p和标记数组book我们需要开大一个空间,也是因为边界。

  3. 这题是简单题,但是因为数组边界的问题导致在不同编译器上输出有问题。

  4. 其实我还是有问题,为什么本地错误提交正确,我觉得地址访问问题不太可能是随机访问的。

AC代码

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;

//const int N=10e4+10e3;
const int N=104729; // N=104728的时候第四组数据错误(a=b=10e4)
int a,b,p[N+1],book[N+1],cnt=0;
// 考虑一下边界数据、N的大小、最后一个数据b=10e4的时候,输出104729

void init()
{
    for(int i=2;i<=N;i++)
    {
        if(!book[i])
        {
            p[++cnt]=i;
            for(int j=i+i;j<=N;j+=i)
                book[j]=1;
        }
    }
}

int main()
{
    cin>>a>>b;
    init();
    int x=1;
    for(int i=a;i<=b;i++,x++) // 相当于外面int x=0; 函数体里面x++
    {
        if(x%10==0||(i==b)) // if((i+1)%10==0||(i==b))
            cout<<p[i]<<endl;
        else
            cout<<p[i]<<" ";
    }
    return 0;
}
posted @ 2021-03-07 15:06  抓水母的派大星  阅读(62)  评论(0编辑  收藏  举报