PAT1078 Hashing 坑爹

来源:互联网 发布:黑米软件怎么安装 编辑:程序博客网 时间:2024/06/06 19:42

思路:用筛法给素数打表,二次探测法(只需要增加的)–如果hash(key)的位置被占,那么就依次探测hash(key+11)hash(key+22)....hash(key+(size1)(size1)
注意:如果输入的MSize<=1,这也不是素数;如果Msize==104,你需要打表的范围就更大了,因为104不是素数。


AC代码

#include <stdio.h>#include <math.h>#include <string.h>const int maxn = 10000+20;int vis[maxn], pos[maxn];void getPrim(int n) {    int m = sqrt(n+0.5);    memset(vis, 0, sizeof(vis));    vis[0] = vis[1] = 1;    for(int i = 2; i <= m; i++) if(!vis[i])        for(int j = i*i; j <= n; j += i) vis[j] = 1;}int main() {    getPrim(maxn);    int n, m;    scanf("%d%d", &n, &m);    if(vis[n]) {        for(int i = n+1; i <= maxn; i++) {            if(!vis[i]) {                n = i;                break;            }        }    }    //printf("%d\n", n);    memset(pos, 0, sizeof(pos));    int key;    for(int i = 0; i < m; i++) {        scanf("%d", &key);        int ok = 0;        for(int j = 0; j < n; j++) {            int hkey = (key+j*j) % n;            if(!pos[hkey]) {                ok = 1;                pos[hkey] = 1;                printf("%d%c", hkey, i == m-1 ? '\n' : ' ');                break;            }        }        if(!ok) printf("-%c", i == m-1 ? '\n' : ' ');    }    return 0;}

如有不当之处欢迎指出!