<?php function josephus($n, $k) { // 创建一个数组表示 $n 个人 $people = range(1, $n); $count = 0; $i = 0; while (count($people) > 1) { $count++; $person = array_shift($people); // 取出一个人 if ($count % $k != 0) { array_push($people, $person); // 如果不是第 $k 个人,则重新放回数组末尾 } else { // 如果是第 $k 个人,则淘汰该人,并将下一位作为起点继续计数 $i++; } if ($i == count($people)) { $i = 0; } } return $people[0]; // 返回最后剩下的那个人 } // 测试代码 $n = 10; // 总人数 $k = 3; // 每次淘汰第 $k 个人 $winner = josephus($n, $k); echo "最后胜利的是第 $winner 个人。"; ?>
以上代码使用了数组来表示所有人,然后使用 array_shift()
函数取出一个人,如果不是第 $k$ 个人,则重新放回数组末尾;如果是第 $k$ 个人,则淘汰该人,并将下一位作为起点继续计数,直到最后只剩下一个人。最后返回最后剩下的那个人的编号。
评论