错误原因:未使用平方探查法解决哈希表的冲突问题
错误代码:(该题与A1145类似)
平方探查法参考博客
平方探查法中的哈希函数对应的哈希表,这个哈希表的大小TableSize最好是一个质数prime
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 10010;
bool hashTable[maxn] = {false};
bool isPrime(int n) {
if(n <= 1) return false;
int sqr = (int)sqrt(1.0 * n);
for(int i = 2; i <= sqr; i++) {
if(n % i == 0) return false;
}
return true;
}
int minSize(int n, int m) {
if(isPrime(n) && n >= m) return n;
else {
for(int i=n+1; ; i++) if(isPrime(i) && i >= m) return i;
}
}
int main() {
int n, m, temp;
cin >> n >> m;
n = minSize(n, m);
for(int i=0; i<m; i++) {
cin >> temp;
if(i) cout << " ";
temp %= n;
if(hashTable[temp] == false) {
cout << temp;
hashTable[temp] = true;
} else cout << "-";
}
return 0;
}
AC代码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 10010;
bool hashTable[maxn] = {false};
bool isPrime(int n) {
if(n <= 1) return false;
int sqr = (int)sqrt(1.0 * n);
for(int i = 2; i <= sqr; i++) {
if(n % i == 0) return false;
}
return true;
}
int minSize(int n, int m) {
if(isPrime(n) && n >= m) return n;
else {
for(int i=n+1; ; i++) if(isPrime(i) && i >= m) return i;
}
}
int main() {
int n, m, a, temp;
cin >> n >> m;
n = minSize(n, m);
for(int i=0; i<m; i++) {
cin >> a;
if(i) cout << " ";
temp = a % n;
if(hashTable[temp] == false) {
cout << temp;
hashTable[temp] = true;
} else {
int step; // -----------------------------------------------------
for(step = 1; step < n; step++) {
temp = (a + step * step) % n;
if(hashTable[temp] == false) {
cout << temp;
hashTable[temp] = true;
break;
}
}
if(step >= n) cout << "-"; // ------修改的部分-----加入二次探查法解决冲突问题----------
}
}
return 0;
}