PAT 1078 Hashing (25)

<pre name="code" class="cpp">/**
1、素数判断时 1要分开考虑,尽量不要用开方运算,可以用乘法替代   | 素数判断还可以使用素数表
2、二次哈希的探测公式index = (data % msize+i*i) % msize;
3、一开始把msize的最大值当成了可选的素数最大值,这个是导致一直不能ac的主要原因
**/

 
#include <iostream>
#include <climits>
#include <fstream>
#include <string>
#include <map>
#include <cctype>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <memory>

using namespace std;




vector<int>positions;
const int MAX_TABLE_SIZE=10000;

/*
bool isprime(int n){

    if(n==1)return false;
    if(n==2)return true;
    if(n % 2 == 0) return false;

    int low = (int)sqrt((double)n);
    //cout<<"low : "<<low<<endl;
    bool flag=true;
    int k=3;
    while(k<=low){
        if(n % k==0){
            flag=false ;
            break;
        }
        k+=2;
    }
    return flag;

}*/
bool isprime(int n){

    if(n==1)return false;
    if(n==2)return true;
    if(n % 2 == 0) return false;
    bool flag=true;
    for(int k=3;k*k<=n;++k){
        if(n % k == 0){
            flag=false;
            break;
        }
    }
    return flag;

}

int find_table_size(int isize){
    for(int i=isize;;++i){
        if(isprime(i)){
            return i;
        }
    }

}

int get_index(int *p ,int data ,int msize){
    int index=-1;
    bool isIndexOk=false;
    for(int i =0;i<msize;++i){
        index = (data % msize+i*i) % msize;
        if(p[index]==0){
            p[index]=1;
            isIndexOk=true;
            break;
        }
    }

    if(!isIndexOk)index=-1;
    return index;
}

int main()
{
    ifstream cin("data.txt");
    int msize=0,n=0;
    cin>>msize>>n;
    msize=find_table_size(msize);


    for(int t=1;t<=25;t++){
        if(isprime(t)){
            cout<<t<<" is prime\n";
        }else{
            cout<<t<<" is not prime\n";
        }
    }



    int *p =new int[msize];
   // memset(p,0,msize*sizeof(int));
    for(int i=0;i<msize;++i){
        p[i]=0;
    }

    int index=0;
    int data=0;
    for(int i=0;i<n;++i){
        cin>>data;
        index=get_index(p,data,msize);
        positions.push_back(index);
    }
    int len=positions.size();
    for(int i=0;i<len;++i){
        if(i!=len-1){
            if(positions[i]==-1)cout<<"- ";
            else cout<<positions[i]<<" ";
        }else{
            if(positions[i]==-1)cout<<"-\n";
            else cout<<positions[i]<<"\n";
        }
    }


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值