[PAT解题报告] Hashing

关于hash的模拟,不难。首先hash的size需要自己确定,找到不小于m的第一个质数就可以了,质数判断用暴力判断,从2到sqrt(m)枚举因数就可以。
hash探测x采用看一下x % m,  (x + 1 ^ 2) % m, (x + 2 ^ 2) % m.... (x + (m - 1) ^ 2) % m, 第一个没有使用的位置来保存x,如果全占满了,没地方存x,输出"-"。

代码:
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

bool mark[10004];
bool test(int x) {
    if (x == 1) {
        return false;
    }
    for (int i = 2; i * i <= x; ++i) {
        if (x % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
int m,n;
    scanf("%d%d",&m,&n);
    for (;!test(m);++m)
    ;
    for (int i = 0; i < n; ++i) {
        int x;
        scanf("%d",&x);
        if (i) {
            putchar(' ');
        }
        x %= m;
        int j;
        for (j = 0; j < m; ++j) {
            int key = (x + j * j) % m;
            if (!mark[key]) {
                printf("%d",key);
                mark[key] = true;
                break;
            }
        }    
            
        if (j >= m) {
            putchar('-');
        }
        
    }
    puts("");
    return 0;
}

原题链接: http://www.patest.cn/contests/pat-a-practise/1078
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务