原题链接
考点
用平方探测法解决Hash冲突。
思路
根据题目要求,表的大小最好的素数,因此首先更新表的大小。在用平方探测去找相应的位置并输出即可。
代码
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int isprime(int x){
if(x<=1)return 0;
for(int i=2;i<=sqrt(x);i++){
if(x%i==0)return 0;
}
return 1;
}
int main(){
int m,n,key;
cin>>m>>n;
while(!isprime(m))m++;//从新定义位置
vector<int> v(m);//定义表
for(int i=0;i<n;i++){
cin>>key;
int j,pos,flag=0;//pos为最后位置,flag用于标识是否找到
for(j=0;j<=m/2;j++){
pos = (key+j*j)%m;//找位置
if(v[pos]==0){//已经找到位置
v[pos]=key;
flag = 1;
break;
}
}
if(flag)cout<<pos;
else cout<<'-';
if(i!=n-1) cout<<" ";
}
return 0;
}