每日一题: 二 杀人事件

c/c++

浏览数:211

2019-3-28

假设有n个人站成一个圆圈,按顺序排列1到n。
1号开始用剑杀死2号。然后他把剑传给仍站着的下一个人,在这种情况下,3号。3号然后用剑杀4号,并将其传给5号。这种模式继续在圈内和周围,直到只有一个人保持。
最后一个人的序号是多少?
例子:

假设有5个人站成一圈
1号拿剑杀死2号,传递给3号,
3号拿剑杀死4号,传递给5号,
5号拿剑杀死1号,传递给3号,
3号拿剑杀死5号,最终获胜
function circle_slash(int $n): int {
  // Coding and coding ... 
  
}

其中,$n为人数.
祝君好运!
答案,我会在评论区中查看,谢谢!晚上我会搬出示例代码!谢谢 segmentfault团队 清蒸不是水煮 提供的意见

例子:
让我们来看看PHP的最简单的例子

function circle_slash(int $n): int {
  return 1 + 2 * ($n - 2 ** ~~log($n, 2));
}

暂时算法最优的:

function circle_slash(int $n): int {
  $multiplier = 2;
  $firstKiller = 1;
  
  while ($n > 1) {
    $firstKiller += ($n % 2) * $multiplier;
    $n = floor($n / 2);
    $multiplier *= 2;
  }
  
  return $firstKiller;
}

不过这两个都不是我写的,我得感谢chenx提供的想法.谢谢!
至于第一个例子,我是在google而得到.感谢 donaldsebleung.