整型关键字的平方探测法散列 陈越

#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编辑  收藏  举报

导航