浙大慕课数据结构-11-散列2 Hashing (25分)

这个参考了这篇文章,11-散列2 Hashing (25分)我试着不用容器vector,替换成int v[Tsize];一样可以AC
错误记录:

  1.  int i,p = (N%2)? N+2:N+1;//wrong used int i,p = (p%2)? N+1:N+2 找下一个指数的代码昨天刚写过,这里就犯错两个
    
  2. for(i=sqrt(q);i>=2;i–){//这里i>=2错写成i>2 判断一个数是不是素数,要对1和他本身之间的所有数进行判断,我这里忽略了2,造成了错误,把4判断为素数
  3.  	if(k==Tsize) cout<<"-";//if的位置放错了
     	if(i!=N-1) cout<<" "; 
     	这里对if的的位置错误放到了循环内部,但实际上在每一次的for循环,都应该读入一个数,输出一个数。
    
  4.  	while(k<Tsize){
      	if(v[pos]==0){
          	v[pos] = key;
          	cout<<pos;
          	break;//forget this
      while循环的退出条件总是忘记,当输出pos后就应该退出本次循环了
    
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<vector>
using namespace std;//dont forget ;
int NextPrime(int N){
  	if(N==1) return 2;
  	int i,p = (N%2)? N+2:N+1;//wrong used int i,p = (p%2)? N+1:N+2
  	while(1){
      	double q = p;
      	for(i=sqrt(q);i>2;i--){
          	if(p%i==0) break;
        }
      	if(i==2) return p;
      	else p += 2;
    }
}
int IsPrime(int N){
  	int i;
  	double q = N;
  	if(N==1) return 0;
  	else if(N==2) return 1;
  	else{
      	for(i=sqrt(q);i>=2;i--){//这里i>=2错写成i>2
      			if(N%i==0) return 0;
    		}
  			return 1;
    }
}
int main(){
  	int MSize,N,Tsize,pos,temp,i,k;
  	cin>>MSize>>N;
  	if(IsPrime(MSize)) 
      	Tsize = MSize;
  	else Tsize = NextPrime(MSize);
  	vector<int> v(Tsize);
  	for(i=0;i<Tsize;++i){
      	v[i] = 0;
    }
  	for(i=0;i<N;++i){
      	int key;
      	k = 0;
      	cin>>key;
      	pos = key%Tsize;
      	temp = pos;
      	while(k<Tsize){
          	if(v[pos]==0){
              	v[pos] = key;
              	cout<<pos;
              	break;//forget this
            }
          	else{
              	k++;
              	pos = (temp+k*k)%Tsize;
            }
        }
  			if(k==Tsize) cout<<"-";//if的位置放错了
  			if(i!=N-1) cout<<" ";
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值