整型关键字的平方探测法散列 陈越
#include<bits/stdc++.h>
using namespace std;
map<int, int>bj;
int p[30050];
//埃筛法求
void getprime () {
for (int i = 1; i <= 30050; i++) p[i] = 1;
p[0] = p[1] = 0;
for (int i = 2; i <= 30050; i++) if (p[i] == 1) for (int j = 2 * i; j <= 30050; j += i) p[j] = 0;
}
//对应格式输出
void print (int i, int idx) {
if (i == 0) cout << idx;
else cout << " " << idx;
}
int main() {
getprime();
int m, n;
cin >> m >> n;
int k = m;
if (p[m] != 1) { //如果长度不是质数,找比它大的第一个质数
for (int i = m; i < 30050; i++)
if (p[i] == 1) {
k = i;
break;
}
}
for (int i = 0; i < n; i++) {
int x;
cin >> x;
int flag = 1;
//在第二个for循环里 如果未被标记过的位置 直接标记然后退出循环
//只有标记过的才会循环下去
//直接这样写 避免了讨论标记过与未标记过的情况
for (int j = 0; j < n; j++ ) { //j从0开始
int id = (x + j*j) % k;
if (!bj[id]) {
bj[id] = 1;
print(i, id);
flag = 0;
break;
}
}
if (flag) cout << " -";
}
}
posted on 2024-12-02 14:23 swj2529411658 阅读(7) 评论(0) 编辑 收藏 举报