Tips:
- 说到此题真是略显辛酸.3月份做这题的时候犯过错,现在又犯了同样的错.务必看清题目啊,题目说的很清楚,用平方探测法处理冲突,怎么就是不长眼呢?
- 素数的计算.也挺久没遇到素数了,突然一下子忘了2是不是素数,然后想当然的认为它不是.以后碰到这种问题得好好思考思考,网上查查,确认之后再写.不然写到后面把前面的问题给忽略了,就会一直找不到错误在哪.
- C/C++的一些基本的原理还是没高清.给数组开辟新空间后如果没释放掉,后面再给它开辟新空间的话,可能会引用旧的地址空间,而且旧的数据也还在.而我继续想当然地认为new之后数组各位都为0.后来尝试过delete[],发现不起作用,于是用笨方法,每位设为0.
- 最后就是注意最后一个输出不要有空格.
- 心好累,慢慢捡起来吧.
#include <iostream>
int getPrime(int size){
int i,k;
if(size < 3)
return 2;
if(size == 3)
return 3;
while(true){
k = size / 2;
for(i = 2;i <= k;i ++){
if(size % i == 0)
break;
}
if(i > k)
return size;
++size;
}
}
int main() {
int size,n,num,extra,i,j,k;
int *hash,*loc;
while(scanf("%d %d",&size,&n) != EOF) {
if(n == 0)
continue;
size = getPrime(size);
hash = new int[size];
loc = new int[n];
for(i = 0;i < size;i++)
hash[i] = 0;
for(i = 0;i < n;i++)
loc[i] = 0;
for(i = 0;i < n;i++){
scanf("%d",&num);
extra = num % size;
for(j = extra,k = 0;k < size ;j = (extra + k * k) % size){
if(hash[j] == 0) {
loc[i] = j;
hash[j] = 1;
break;
}
k++;
}
if(k >= size )
loc[i] = -1;
}
printf("%d",loc[0]);
for(i = 1;i < n;i++){
if(loc[i] == -1)
printf(" -");
else
printf(" %d",loc[i]);
}
printf("\n");
}
return 0;
}