PAT A1078 Hashing

这是一道哈希散列的二次方探查法的问题,其中也用到了素数的判定问题,要注意的是: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(" ");
        }
    }
}
原文地址:https://www.cnblogs.com/shuibeng/p/13562543.html