PAT 1078. Hashing (模拟)

来源:互联网 发布:php调用nodejs接口 编辑:程序博客网 时间:2024/05/17 01:03

模拟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;}


0 0
原创粉丝点击