PAT 1078. Hashing (模拟)

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


你可能感兴趣的:(C++,hash,pat,Quadratic,Probing)