原题链接:https://www.nowcoder.com/pat/5/problem/4308
#pragma warning(disable:4996) #include<iostream> #include<algorithm> using namespace std; int k[10005]; int N, MSize; bool visited[10005]; /* 题目总结:主要两个考点 1)判断质数和找下一个质数 (1)注意处理1和2 (2)注意质数n 不能从2到被sqrt(n)+1 整除 可以提高一点点效率 2)哈希表 (1)避免冲突,这里用的是平方探测法,裂开,一开始忘了相关的知识,quadratic probing又比较陌生 以为冲突就是输出- (2) 这里顺便再复习一下 常见的散列函数:除留余数法,直接定址法,数值分析法,平方取中法 解决冲突的方法:拉链法,开放定址法(线性 平方 伪随机),再散列法 */ // 判断质数 bool is_prime(int n) { int sq = (int)sqrt(n); for (int i = 2; i < sq+1; i++) { if (n%i == 0) { return false; } } return true; } // 返回一个比n大的最小素数,可能n本身就是素数 int next_prime(int n) { if (n == 1 || n == 2)return 2; if (is_prime(n))return n; while (!is_prime(++n)); return n; } int main() { cin >> MSize >> N; int key; int table_size = next_prime(MSize); for (int i = 0; i < N; i++) { cin >> k[i]; int j = 0; for (; j < table_size; j++) { key = (k[i]+j*j) % table_size; if (!visited[key]) { printf("%d", key); visited[key] = true; break; } } if (j == table_size)printf("-"); if (i != N - 1)printf(" "); } system("pause"); return 0; }