其他分享
首页 > 其他分享> > 1078 Hashing (25)

1078 Hashing (25)

作者:互联网

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=10010;
int n,m;
int que[maxn]={0};
bool isprime(int n){
	if(n<=1) return false;
	if(n==2) return true; 
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0) return false;
	}
	return true;
}

int main(){
	scanf("%d%d",&m,&n);
	for(int i=m;i<maxn;i++){ //判断下一个质数并赋值给m 
		if(isprime(i)==true){
			m=i;break;
		}
	}
	int tmp;
//	printf("%d\n",m);
	for(int i=0;i<n;i++){
		scanf("%d",&tmp);
		int step=0;
		bool isfind=false;
			while(step<maxn){
				int j=(tmp+step*step)%m;//用修正的m限制住j! 
				step++;
//				printf("%d",j);
				if(!que[j]){
					isfind=true;
					printf("%d",j);
					que[j]=1;
					break;
				}
			}
			if(!isfind) printf("-");
		if(i<n-1) printf(" ");
	}
	printf("\n");
	return 0;
}

另外附上大神(薛玉洁)代码:

#include <iostream>
using namespace std;
bool isprime(int n){                  //判断是否为素数
   if(n<=1) return false;
   if(n==2) return true;
   for(int i=2;i<n;i++){
       if(n%i==0) return false;
    }
  return true;
}
int main(){
   int n,tsize,temp,s[10010]={0};
   cin>>tsize>>n;
   while(!isprime(tsize))          //找到最近的素数作为哈希表长度
       tsize++;
   for(int i=0;i<n;i++){
       cin>>temp;
       int j,k;
       for(j=0;j<tsize;j++){
           k=(temp+j*j)%tsize;    //平方探测法
           if(!s[k]){
               s[k]=1;
               cout<<k;
               break;
            }
        }
       if(j==tsize) cout<<"-";   //没有找到插入位置
       if(i!=n-1) cout<<" ";
    }
   return 0;
}

标签:25,tsize,1078,int,namespace,bool,isprime,include,Hashing
来源: https://blog.csdn.net/qq_37150711/article/details/104721362