1078. Hashing

Tips:

  • 说到此题真是略显辛酸.3月份做这题的时候犯过错,现在又犯了同样的错.务必看清题目啊,题目说的很清楚,用平方探测法处理冲突,怎么就是不长眼呢?
  • 素数的计算.也挺久没遇到素数了,突然一下子忘了2是不是素数,然后想当然的认为它不是.以后碰到这种问题得好好思考思考,网上查查,确认之后再写.不然写到后面把前面的问题给忽略了,就会一直找不到错误在哪.
  • C/C++的一些基本的原理还是没高清.给数组开辟新空间后如果没释放掉,后面再给它开辟新空间的话,可能会引用旧的地址空间,而且旧的数据也还在.而我继续想当然地认为new之后数组各位都为0.后来尝试过delete[],发现不起作用,于是用笨方法,每位设为0.
  • 最后就是注意最后一个输出不要有空格.
  • 心好累,慢慢捡起来吧.
#include <iostream>

int getPrime(int size){
    int i,k;
    if(size < 3)
        return 2;
    if(size == 3)
        return 3;
    while(true){
        k = size / 2;
        for(i = 2;i <= k;i ++){
            if(size % i == 0)
                break;
        }
        if(i > k)
            return size;
        ++size;
    }
}

int main() {
    int size,n,num,extra,i,j,k;
    int *hash,*loc;
    while(scanf("%d %d",&size,&n) != EOF) {
        if(n == 0)
            continue;
        size = getPrime(size);
        hash = new int[size];
        loc = new int[n];
        for(i = 0;i < size;i++)
            hash[i] = 0;
        for(i = 0;i < n;i++)
            loc[i] = 0;
        for(i = 0;i < n;i++){
            scanf("%d",&num);
            extra = num % size;
            for(j = extra,k = 0;k < size ;j = (extra + k * k) % size){
                if(hash[j] == 0) {
                    loc[i] = j;
                    hash[j] = 1;
                    break;
                }
                k++;
            }
            if(k >= size )
                loc[i] = -1;
        }
        printf("%d",loc[0]);
        for(i = 1;i < n;i++){
            if(loc[i] == -1)
                printf(" -");
            else
                printf(" %d",loc[i]);
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值