模拟hash表的插入,采用quadratic probing的冲突解决办法。
其中num为输入的数,每次的key = (num + i * i) % num;
注意到,这里的公式和点击打开链接中的却不同... 哪有准确的定义呢
for (int i = 0; i <= m-1; ++ i) { key = (num + i * i) % m; if (table[key] == false) { find = true; table[key] = true; break; } }
一直错在素数的判断上,我不知道为什么将下面的 "i<=num/2" 改为 "i <= ceil(sqrt(num)-0.000001)"就没发通过测试点1. 知道的朋友指教一下,谢。
bool is_prime(int num) { if (num < 2) { return false; } for (int i = 2; i <= num / 2; ++ i) { if (num % i == 0) { return false; } } return true; }
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <set> using namespace std; bool is_prime(int num) { if (num < 2) { return false; } for (int i = 2; i <= num / 2; ++ i) { if (num % i == 0) { return false; } } return true; } int get_closest_prime(int m) { for (int i = m; ; ++ i) { if (is_prime(i)) { return i; } } } int main() { int n, m, num, key; bool table[10010], first = true; memset(table, 0, sizeof(table)); scanf("%d%d", &m, &n); m = get_closest_prime(m); for (int i = 0; i < n; ++ i) { bool find = false; scanf("%d", &num); for (int i = 0; i <= m-1; ++ i) { key = (num + i * i) % m; if (table[key] == false) { find = true; table[key] = true; break; } } if (find == true) { if (first) { printf("%d", key); first = false; } else { printf(" %d", key); } } else { if (first) { printf("-"); first = false; } else { printf(" -"); } } } return 0; }