题目
![]()
解法1
点击查看代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 判断一个数是否为素数
bool isPrime(int num) {
if (num <= 1) return false;
int sqr = sqrt(num);
for (int i = 2; i <= sqr; ++i)
if (num % i == 0) return false;
return true;
}
// 获取大于等于n的最小素数
int getNextPrime(int n) {
while (!isPrime(n)) ++n;
return n;
}
int main() {
int MSize, N;
cin >> MSize >> N;
int TSize = getNextPrime(MSize); // 实际使用的表大小
vector<int> hashTable(TSize, -1); // 初始化哈希表,-1表示空位
vector<int> result; // 存放结果位置
for (int i = 0; i < N; ++i) {
int key;
cin >> key;
int pos = -1;
for (int j = 0; j < TSize; ++j) {
int idx = (key % TSize + j * j) % TSize; // 二次探测法
if (hashTable[idx] == -1) {
hashTable[idx] = key;
pos = idx;
break;
}
}
if (pos == -1) result.push_back(-1);
else result.push_back(pos);
}
for (int i = 0; i < result.size(); ++i) {
if (i) cout << " ";
if (result[i] == -1) cout << "-";
else cout << result[i];
}
cout << endl;
return 0;
}