0

我在数据结构课程中,无法重现讲师给出的示例数据。该问题是经典的 Josephus 问题,用户提供了成员数、步长间隔和起始位置。

具体来说,我被告知有 99 人,从 23 日开始,数到 5 点,应该让 84 人成为最后一个站着的人。

我想出:65。我再次运行时认为输入可能是 99 人,从 5 开始,间隔为 23。结果:42。

我的分配解决方案涉及一个循环链表,但是这个 c 代码在所有情况下都会产生相同的输出:

#include <stdio.h>

int josephus(int n, long k)
{
  if (n == 1)
    return 1;
  else
  /* The position returned by josephus(n - 1, k) is adjusted because the
   *        recursive call josephus(n - 1, k) considers the original position 
   *               k%n + 1 as position 1 */
 return (josephus(n - 1, k) + k-1) % n + 1;
}

int main()
{
int n = 99;
int k = 23;
printf("The chosen place is %d\n", josephus(n, k) + 5);
return 0;
}

再次感谢。

4

1 回答 1

1

拉福尔认为倒计时是跨过的。即,从 1 开始,数到 2 将首先杀死第 4 个人。文本中确实有一个例子。这并不直观,而且 LaFore 似乎是唯一这样计算的作者。

于 2013-02-22T16:33:37.350 回答