PAT甲级A1078---素数

1078 Hashing (25分)

1078
分析:

给一个mszie和n个数,要求输出每一个数在散列表中的位置。使用正向平方探测法。如果msize不是质数,则往上寻找一个最小的质数替代。
使用hashTable记录每个位置是否存放值。
注意正向平方探测的方法是 M = (a + step * step) % msize ,step从1一直增长到msize(可以证明如果达到msize时还无法插入,则这个元素无法被插入)。

C++:
#include 
#include 

const int maxn = 10010;
bool hashTable[maxn];

bool isPrime(int n) {
    if (n <= 1) return false;
    int sqr = (int) sqrt(n * 1.0);
    for (int i = 2; i <= sqr; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

int main() {
    int msize, n;
    scanf("%d %d", &msize, &n);
    while (isPrime(msize) == false) {
        msize++;
    }
    int a;
    for (int i = 0; i < n; i++) {
        scanf("%d", &a);
        int mod = a % msize;
        if (hashTable[mod] == false) {
            hashTable[mod] = true;
            if (i == n - 1) {
                printf("%d", mod);
            } else {
                printf("%d ", mod);
            }
        } else {
            int step;
            for (step = 1; step < msize; step++) {
                mod = (a + step * step) % msize;
                if (hashTable[mod] == false) {
                    hashTable[mod] = true;
                    if (i == n - 1) {
                        printf("%d", mod);
                    } else {
                        printf("%d ", mod);
                    }
                    break;
                }
            }
            if (step >= msize) {
                if (i == n - 1) {
                    printf("-");
                } else {
                    printf("- ");
                }
            }
        }
    }
    return 0;
}

你可能感兴趣的:(PAT甲级A1078---素数)