这是一道哈希散列的二次方探查法的问题,其中也用到了素数的判定问题,要注意的是:1不是素数
哈希散列中的二次方探查法主要流程如下:
- 如果hashTable里面key % size的下标对应的hashTable为false,说明这个下标没有被使用过,直接输出。(这些size必须满足题目给的条件,即是一个素数)
- 否则step步长从1加到size-1,一次次尝试是否能使index = (key + step * step) % size;所对应的位置没有元素,如果都没有找到就输出“-”,否则就输出这个找到的元素的位置
#include<cstdio>
#include<math.h>
using namespace std;
const int M = 10010;
bool ishash[M];
bool isprime(int n){
if(n==1) return false;//1不是素数
int half = (int)sqrt(n);
for(int i = 2;i<=half;i++){
if(n%i==0) return false;
}
return true;
}
int main(){
int m , n;
scanf("%d %d",&m,&n);
while(!isprime(m)){
m++;
}//找新m,为素数
int v;//读数
//输出
for(int i = 0;i < n;i++){
scanf("%d",&v);
int a = v%m;//0..m-1
int k = 1;
//二次方探查法
while(k<m&&ishash[a]){
a= (v + k*k)%m;
//探测点
k++;
}
if(k>=m){
printf("-");
}else{
ishash[a] = true;
printf("%d",a);
}
if(i < n-1){
printf(" ");
}
}
}