题目
题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805309963354112
中文题。
思路
素数打表+控制格式
注意
-
数组直接开10e4+10,cnt开在外面的话,运行出来是错误的,但是提交是AC的,难道后台数据问题,郁闷死我了,我说怎么代码挺对,本地输出不对。可能边界上的点在不同编译器下访问存在问题。
-
需要注意边界上的数据,也就是如果a和b同时都给出10e4,这样子的话输出就是104729,影响开的数组的大小。所以之后写题的时候数组大小不一定要根据题意去开大10个空间,需要考虑最大的数据,根据这个数据去开,而且记录素数的数组p和标记数组book我们需要开大一个空间,也是因为边界。
-
这题是简单题,但是因为数组边界的问题导致在不同编译器上输出有问题。
-
其实我还是有问题,为什么本地错误提交正确,我觉得地址访问问题不太可能是随机访问的。
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;
}