约瑟夫问题是一个经典的算法问题.
人们围成一圈, 从圆圈中的指定位置开始计数, 并沿指定方向绕圆圈进行. 在跳过指定数量的人之后, 处刑下一个人. 对剩下的人重复该过程, 从下一个人开始, 继续朝同一方向跳过相同数量的人, 直到只剩下一个人, 并被释放.
那么问题来了, 给定人数、起点、方向和要跳过的数字, 选择初始圆圈中的哪个位置可以避免被处决呢?
这个问题是以弗拉维奥·约瑟夫命名的, 他是1世纪的一名犹太历史学家. 他在自己的日记中写道, 他和他的
自杀方式是
这个问题有很多种解决的办法, 但是大多数情况下都需要计算机的帮助. 那有没有一种情况我们可以直接口算呢? 有.
当报数到第二个人就得自杀, 并且总人数是
以
可以看出每一轮结束后总人数减半, 仍然是
那么按照这个游戏规则当人数为