#include <iostream>
#define MAXSIZE 10007 // nextPrime(10000)
using namespace std;
bool isPrime( int num ) {
if( num == 1 ) return false; // 这里注意要判断1!
for( int i = 2; i * i <= num; i++ )
if( num % i == 0 ) return false;
return true;
}
int nextPrime( int num ) {
int i;
for( i = num; !isPrime(i); i++ );
return i;
}
int QuadraticProbing( int hashTab[], int MSize, int key ) {
int pos;
for( int i = 1; i <= MSize / 2; i++ ) {
pos = (key + i*i) % MSize;
if( hashTab[pos] == 0 ) return pos;
// pos = (key - i*i + MSize) % MSize; // 可能是负数
// if( hashTab[pos] == 0 ) return pos;
}
return -1; // 没找到
}
int main() {
int MSize, N, num, key;
int hashTab[MAXSIZE];
bool flag = false;
cin >> MSize >> N;
MSize = nextPrime(MSize);
for( int i = 0; i < MSize; i++ )
hashTab[i] = 0; // 初始化
for( int i = 0; i < N; i++ ) {
cin >> num;
key = num % MSize;
if( hashTab[key] == 0 ) { // 未被占用
hashTab[key] = num;
if( flag ) cout << " "; // 除了第一次不执行
flag = true;
cout << key;
} else {
key = QuadraticProbing( hashTab, MSize, key );
if( key != -1 ) {
hashTab[key] = num;
cout << " " << key;
}
else cout << " -";
}
}
}
- 表长不是素数要调整为素数
- 平方探测法
注意这里的平方探测法不考虑 -1 -4 -9...
把源代码对应的部分注释掉后可通过测试