//平方探测法出现挑来挑去找不到位置的情况
#include <iostream>
#include <cmath>
#define MaxTableSize 100000
const int maxn = 10001;
using namespace std;
typedef struct HTable *Hashtable;
struct HTable {
int *list;
int size;
};
bool isPrime(int m) {
if (m <= 1)return false;
int sqr = (int)sqrt(1.0*m);
for (int i = 2; i <= sqr; i++)
{
if (m%i == 0) return false;
}
return true;
}
int nextPrime(int m) {
if (!isPrime(m)) {
//最开始没有考虑用户可能输入1 照抄的陈姥姥寻早下一个素数的代码 不对
if (m == 1 || m % 2 == 0) //1不是素数
m++;
while (m<MaxTableSize)
{
int i;
for (i = (int)sqrt(m); i > 2; i--)
if (m%i == 0)break;
if (i == 2)break;
else m += 2;//对奇数判断 是否为素数
}
return m;
}
}
Hashtable creatHash(int size) {
Hashtable H;
H = new struct HTable;
H->size = nextPrime(size);
H->list = new int [H->size];
for (int i = 0; i < H->size; i++)
{
H->list[i] = 0;
}
return H;
}
int Insert(Hashtable H, int x) {
int pos = x % H->size;
int temp = pos;
int i=0;
for (i = 0; i < H->size && H->list[pos]; i++)
{
pos = temp + pow((i+1),2);
pos = pos % H->size;
}
if (i == H->size) {
pos = -1;
}
H->list[pos] = 1;
return pos;
}
int main() {
int m, n;
int t;
int pos[maxn];
cin >> m >> n;
Hashtable H = creatHash(m);
for (int i = 0; i < n; i++)
{
cin >> t;
pos[i] = Insert(H,t); //第几个元素所在的位置
}
cout << pos[0];
for (int i = 1; i < n; i++) {
if (pos[i] == -1) {
cout << " -";
}
else {
cout << " " << pos[i];
}
}
system("pause");
return 0;
}
陷入的点有三个:
1.寻找下个素数,照着上一道题的代码复制了一遍,显示报错;问题在于,没有考虑用户输入为1 ,既不是素数,还是奇数。
2.这道题的平方探测法仅仅使用正向遍历,不用考虑负向的,才开始没注意。
3.平方探测法是在原位置的基础上进行跳跃遍历找空,不是找完一个位置不行再在该位置的基础上平方。(现在想想也是…不过写代码的时候比较懵)