题目


解法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;
}