这是T1的零分代码
#include<iostream>
#include<cstdio>
using namespace std;
inline int read()
{
int x=0; char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x;
}
const int N=10000005;
int T,b[N],last[N],nxt[N];
bool check(int x)
{
int tmp=0;
while(x)
{
tmp=x%10;
if(tmp==7) return 1;
x/=10;
}
return 0;
}
int main()
{
//freopen("number.in","r",stdin);
//freopen("number.out","w",stdout);
cin>>T;
for(int i=7;i<=N;++i)
{
if(b[i]) continue;
if(check(i))
{
b[i]=1;
for(int j=2*i;j<=N;j+=i) b[j]=1;
}
}
int last=0;
for(int i=1;i<=N;++i)
{
if(b[i]) nxt[i]=-1;
else
{
nxt[last]=i;
last=i;
}
}
nxt[0]=-1;
int x;
while(T--)
{
x=read();
printf("%d\n",nxt[x]);
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
这是AC代码
#include<iostream>
#include<cstdio>
using namespace std;
inline int read()
{
int x=0; char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
return x;
}
const int N=10000005;
int T,b[N+1],last[N+1],nxt[N+1];
bool check(int x)
{
int tmp=0;
while(x)
{
tmp=x%10;
if(tmp==7) return 1;
x/=10;
}
return 0;
}
int main()
{
//freopen("number.in","r",stdin);
//freopen("number.out","w",stdout);
cin>>T;
for(int i=7;i<=N;++i)
{
if(b[i]) continue;
if(check(i))
{
b[i]=1;
for(int j=2*i;j<=N;j+=i) b[j]=1;
}
}
int last=0;
for(int i=1;i<=N;++i)
{
if(b[i]) nxt[i]=-1;
else
{
nxt[last]=i;
last=i;
}
}
nxt[0]=-1;
int x;
while(T--)
{
x=read();
printf("%d\n",nxt[x]);
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
第一份代码其实就是数组越界了1个,所有数组大小+1就能过了,但是在考场上所有样例都能过,而且对拍也没问题。想问一下评测环境下会怎样?