确定数字是否为周期数

时间:2010-11-15 07:24:00

标签: c++ algorithm

解决方法#:

的定义
  • 这是一个整数,正好是N位数,每个都在1到9之间,包括在内。
  • 数字形成一个序列,每个数字表示序列中下一个数字出现的位置。这是通过给出序列中下一个数字出现的数字右侧的位数来完成的。如有必要,计数从最右边的数字回到最左边。
  • 数字中最左边的数字是序列中的第一个数字,并且在数字中的所有数字都使用了一次之后,序列必须返回到此数字。
  • 数字中不会出现多次数字。

检查重复数字不是问题,但我似乎无法想出一个检查“runaround”部分的好方法。我正在寻找比实际c ++更多的建议/伪代码。

2 个答案:

答案 0 :(得分:1)

如果你将整数转换成一个字符串,它应该没有任何困难:你需要的只是一个operator [](std :: string类提供)和一个boolean数组,用于记录哪个元素已被检查:

string value = input_integer;
vector<bool> checked;

int index = value[0];
checked[0] = true;
bool done = false;
while (!done) {
   index = get_wrapped_index(value, index);
   if (!checked[index])
      checked[index] = true;
   else 
      return false; // not a roundaround

   if allTrue(checked) && index == 0
      done = true;
}
return true;

你必须编写get_wrapped_index(string s,index i)代码,它必须返回s [i]指定的整数,给定由问题指定的右包装costraint。

答案 1 :(得分:0)

您有4条规则,所以只需编写代码来检查每条规则。

  • 该数字为N位数。确定N是什么。可以通过转换为每个数字的字符串或向量来完成。您可能需要使用除以10和mod(%)10几次。

  • 从一位移到下一位的方法。因此,如果您在数字位置x具有值y,则移动到x + y mod N,即(x + y)%N。当然,第一个位置被认为是位置0。

  • 您需要检查是否触摸了每个位置,并且还没有重复。这可能是一个检查。如果您知道自己拥有正确的解决方案,并且只有当这是第N次迭代并且您处于索引0时才达到您所见过的数字。

12是失败。因为虽然它是在2次迭代之后你没有达到索引0但是重新访问索引1(2将你从索引1带回到索引1)

11是失败的,因为当你还没有完成所有迭代时,你会看到另一个1。

123失败了,因为你过早地回到1迭代。你不需要知道你没有看到3,或者你回到索引0,只是你太早看到了另一个。

但是,285有效。你看到2然后是5然后是8然后2.你在索引0并且有3次迭代。

您需要存储一组看到过的数字。 vector有点争议,所以你可以使用std :: bitset甚至只是bool [10]会为这个例子或者vector做。您也可以使用std :: set,后一种情况允许您检查其大小以查看迭代次数。