分析:
/*
* quadratic probing 平方探测。
* 增量 <= tableSize/2
* 正数增量,不考虑负数增量。
*/
代码:
#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(const int &n) {
if(n < 2) return false;
if(n > 2 && n%2 == 0) return false;
int sr = sqrt(n);
for(int i(3); i <= sr; i += 2) {
if(n % i == 0) return false;
}
return true;
}
int nextPrime(int a) {
while(!isPrime(a)) ++a;
return a;
}
//返回是否找到插入位置。若找到,data带回插入位置。
bool isAccessInTable(bool *&table, const int &size, int &data) {
int i(0); //增量
int pos(data%size); //位置
int halfSize(size/2);
while(table[pos] && i <= halfSize) {
++i;
pos = (data + i*i)%size;
}
if(i > halfSize) return false;
//找到插入位置。
data = pos;
return true;
}
int main(void) {
int m, n;
cin >> m >> n;
int newSize = nextPrime(m);
bool *hashTable = new bool[newSize]();
//处理第一个数据
int data;
cin >> data;
hashTable[data%newSize] = true;
cout << data%newSize;
//处理其他数据
for(int i(1); i < n; ++i) {
cin >> data;
if(!isAccessInTable(hashTable, newSize, data)) cout << " -";
else {
hashTable[data] = true;
cout << " " << data;
}
}
return 0;
}