<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;
}