思路:用筛法给素数打表,二次探测法(只需要增加的)–如果
hash(key)
的位置被占,那么就依次探测
hash(key+1∗1),hash(key+2∗2)....hash(key+(size−1)∗(size−1)
。
注意:如果输入的
MSize<=1
,这也不是素数;如果
Msize==104
,你需要打表的范围就更大了,因为
104
不是素数。
AC代码
#include <stdio.h>
#include <math.h>
#include <string.h>
const int maxn = 10000+20;
int vis[maxn], pos[maxn];
void getPrim(int n) {
int m = sqrt(n+0.5);
memset(vis, 0, sizeof(vis));
vis[0] = vis[1] = 1;
for(int i = 2; i <= m; i++) if(!vis[i])
for(int j = i*i; j <= n; j += i) vis[j] = 1;
}
int main() {
getPrim(maxn);
int n, m;
scanf("%d%d", &n, &m);
if(vis[n]) {
for(int i = n+1; i <= maxn; i++) {
if(!vis[i]) {
n = i;
break;
}
}
}
//printf("%d\n", n);
memset(pos, 0, sizeof(pos));
int key;
for(int i = 0; i < m; i++) {
scanf("%d", &key);
int ok = 0;
for(int j = 0; j < n; j++) {
int hkey = (key+j*j) % n;
if(!pos[hkey]) {
ok = 1;
pos[hkey] = 1;
printf("%d%c", hkey, i == m-1 ? '\n' : ' ');
break;
}
}
if(!ok) printf("-%c", i == m-1 ? '\n' : ' ');
}
return 0;
}
如有不当之处欢迎指出!