PAT【甲级】1145

题目链接:PAT【甲级】1145
题目简述:就是先给一串数字,分别是表长,要插入表中的数据规模,要查询数据的规模。如果表长不是素数的话,则还要求改变为大于所给数字最小的素数。并且使用(正数)平方探测法进行冲突处理。

#include
using namespace std;

vector<int> table;

int getPrime(int a){
    while(a){
        int i = 2;
        for (; i * i <= a; i++)
            if(a % i == 0)
                break;
        if(a % i != 0)
            return a;
        a++;
    }
    return a;
}

int main(){
    int S, N, M, t;
    cin >> S >> N >> M;
    S = getPrime(S);
    table.resize(S, 0);
    for (int i = 0; i < N;i++){
        cin >> t;
        int j = 0;
        for (; j <= S; j++){//注意这个条件,S是个极限值了,之后就是再循环了。
            if(table[(t + j * j) % S] == 0){
                table[(t + j * j) % S] = t;
                break;
            }   
        }
        if(j > S) printf("%d cannot be inserted.\n", t);
    }
    int times = 0;
    for (int i = 0; i < M;i++){
        cin >> t;
        for (int j = 0; j <= S;j++){//注意这个条件,S是个极限值了,之后就是再循环了。
            times++;
            if(table[(t + j * j) % S] == t || table[(t + j * j) % S] == 0){//如果相等或者访问到空处(其实也就是这个数字不在表中)
                break;
            }
        }
    }
    printf("%.1f", 1.0 * times / M);
    return 0;
}

要注意的就是我代码中注释的那两个点了吧。这样写的话,并不需要额外的标记数组什么的,而且这也是符合散列表查询条件(不会的就去记忆一下),最坑的点是如果查询数字不在表中的情况,考虑到这一点,测试点就都能过了。

你可能感兴趣的:(PAT甲级刷题笔记)