这道题做的时候觉得挺简单的一道A25分的题目,只需要判断是否是素数,会用Hash数组记录就行,后来提交才发现测试点3没过去,上网查了下发现,题目意思弄错了,原来不是试一次不行就放弃了,他还需要用QUadratic probing,即二次方探查法进行探查,看看有没有其他位置可以插入。
其实仔细想想这个方法在当初学数据结构的时候就已经用到过了,只不过题目中的QUadratic probing不认识(也许英语大佬认识呢hhh),知道了这一点解题就不难了,只需要在else部分加上探查的过程就ok 了,下附原始代码与修改后代码及提交截图。
源代码:
using namespace std;
#include<bits/stdc++.h>
const int MAX=10000;
bool h[MAX];
int a[MAX];
bool isPrime(int n){
if(n<=1) return false;//important!!!
int sqr=sqrt(n);
for(int i=2;i<=sqr;i++)
{
if(n%i == 0) return false;
}
return true;
}
int main(){
int m,n;
scanf("%d %d",&m,&n);
int i;
for(i=0;i<n;i++) scanf("%d",&a[i]);
while(!isPrime(m)) m++;
for(i=0;i<n;i++)
{
int tmp=a[i]%m;
if(h[tmp] == 0)
{
h[tmp]=1;
printf("%d",tmp);
}
else printf("-");
if(i!=n-1) printf(" ");
}
return 0;
}
AC代码:
using namespace std;
#include<bits/stdc++.h>
const int MAX=10000;
bool h[MAX];
int a[MAX];
bool isPrime(int n){
if(n<=1) return false;//important!!!
int sqr=sqrt(n);
for(int i=2;i<=sqr;i++)
{
if(n%i == 0) return false;
}
return true;
}
int main(){
int m,n;
scanf("%d %d",&m,&n);
int i;
for(i=0;i<n;i++) scanf("%d",&a[i]);
while(!isPrime(m)) m++;
for(i=0;i<n;i++)
{
int tmp=a[i]%m;
if(h[tmp] == 0)
{
h[tmp]=1;
printf("%d",tmp);
}
else
{
int step;
for(step=1;step<m;step++)
{
tmp=(a[i]+step*step)%m;
if(h[tmp] == 0)
{
h[tmp]=1;
printf("%d",tmp);
break;
}
}
if(step >=m ) printf("-");
}
if(i!=n-1) printf(" ");
}
return 0;
}