题目大意:
给出散列表长TSize和欲插入的元素,将这些元素按读入的顺序插入散列表中,其中散列函数为H(key)=key%TSize,Hash冲突的解决采用平方探查法(正向增加)。
如果题目给叔的TSize不是素数,那么需要将TSize重新赋值为第一个比TSize大的素数元素进行插入。
思路:
1)首先对于一个输入的TSize,如果不是素数,则必须找见一个比它大的素数。
2)开一个bool类型数组HashTable,HashTable[i]==false表示key=i号位未被使用,对每个插入的元素a,计算H(a)并判断对应的位置是否可以使用,。
1.如果未被使用, 那么找见插入的位置,并输出。
2.如果已经被使用,那么下一个检查值key=(a+step*step)%TSize,判断该位置是否被使用,如果使用,则令step++,再进行判断, 当step=Tsize时还没有找见,则表示没有位置。
//PAT_A 1078
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int N = 11111;
bool isPrime(int n) {
if (n <= 1)return false;
int sqr = (int)sqrt(1.0 * n);
for (int i = 2; i <= sqr; i++) {
if (n % i == 0)return false;
}
return true;
}
bool HashTable[N] = { false };//HashTable[i]==false,表示i号位没有被使用
int main() {
int n, Tsize, a;
(void)scanf("%d %d", &Tsize, &n);
while (isPrime(Tsize) == false)Tsize++;
for (int i = 0; i < n; i++) {
(void)scanf("%d", &a);
int key = a % Tsize;
if (HashTable[key] == false) {
HashTable[key] = true;
printf("%d", key);
}
else {
int step;
for (step = 1; step < Tsize; step++) {
key = (a + step * step) % Tsize;
if (HashTable[key] == false) {
HashTable[key] = true;
printf("%d", key);
break;
}
}
if (step == Tsize)printf("-");
}
if (i < n - 1)printf(" ");
}
return 0;
}