题目链接:http://www.patest.cn/contests/mooc-ds/09-1
题目分析:这是一道考察哈希散列表的一道题。题目总体来说是比较简单的,但是可能有的同学英文不好,看不懂题意,这里简单解释一下。
输入的第一行是MSize(你要找到离这个数<可能是素数,可能是合数>最近的素数)和N(接下来整数的个数)。第二行是N个整数。你需要用哈希函数计算位置,如果那个位置被占用,那么按照+1, +4, +9,..., +i^2的顺序看之后是否有位置。如果到最后仍然没有位置,那么就输出-,有位置直接输出对应位置的下标(从0开始)就可以了。
特别说明:
1. 首先这里用的是平方探查法,而且只有正的,没有负的<with positive increments only>。即散列函数应该为。h(key) = (key % MSIZE + j * j) % MSIZE。博主最开始并没有注意到这一点,是参考这篇博文:http://blog.sina.com.cn/s/blog_ce1b01420102vivb.html,这里对原博主进行感谢。
2. 其次就是输出格式的控制,按照惯例,最后一个空格是不能出现的。相信大家都已经比较熟练了,不再赘述。
代码分析:
1 #include <iostream> 2 #include <cmath> 3 4 using namespace std; 5 6 bool Prime(int m)// 判断一个数字是否是素数 7 { 8 if(m < 2) return true; 9 for(int i = 2 ; i <= m/2; i++) 10 if (m % i == 0) 11 return true; 12 return false; 13 } 14 15 int main() 16 { 17 int MSIZE, N; 18 cin >> MSIZE >> N; 19 while(Prime(MSIZE)) MSIZE++; 20 bool *flag = new bool [MSIZE]; 21 for(int i=0; i<MSIZE; i++) 22 { 23 flag[i] = false; 24 } 25 for(int i=0; i<N; i++) 26 { 27 int t; 28 cin >> t; 29 bool Flag = false; 30 for(int j=0; j<N; j++) 31 { 32 int tt = (t % MSIZE + j*j) % MSIZE ; 33 if(flag[tt] == false) 34 { 35 Flag = true; 36 flag[tt] = true; 37 if( i != N-1) 38 cout << tt << " "; 39 else 40 cout << tt; 41 break; 42 } 43 } 44 if(Flag) 45 continue; 46 else 47 { 48 if( i != N-1) 49 cout << "- "; 50 else 51 cout << "-" ; 52 } 53 } 54 return 0; 55 }
AC成果: