C 谜题:谁赢了这场比赛?

C 谜题:谁赢了这场比赛?,c,algorithm,time-complexity,puzzle,space-complexity,C,Algorithm,Time Complexity,Puzzle,Space Complexity,一群孩子组成一个圈。第一个孩子被选中,他们开始从该孩子开始顺时针计数,直到达到一个固定的数字(n,在游戏开始时给出)。当计数达到n时,第n个点上的子项被消除。游戏从下一个孩子开始继续,直到剩下一个孩子。你的目标是打印孩子的位置,直到最后一个 例如,如果有10个孩子,固定数字n为6,则最后一个孩子的位置为3,直到最后一个 有没有更好的编程算法来解决这个问题 另外,我知道我们可以使用数组或其他数据结构轻松实现这一点。我只想要最好的策略,最好是数学方法 我认为最简单的方法仍然是写一个循环(就像维基百科

一群孩子组成一个圈。第一个孩子被选中,他们开始从该孩子开始顺时针计数,直到达到一个固定的数字(n,在游戏开始时给出)。当计数达到n时,第n个点上的子项被消除。游戏从下一个孩子开始继续,直到剩下一个孩子。你的目标是打印孩子的位置,直到最后一个

例如,如果有10个孩子,固定数字n为6,则最后一个孩子的位置为3,直到最后一个

有没有更好的编程算法来解决这个问题

另外,我知道我们可以使用数组或其他数据结构轻松实现这一点。我只想要最好的策略,最好是数学方法


我认为最简单的方法仍然是写一个循环(就像维基百科所说的,把选票交给扬·德沃夏克):

或者,以C语言编写(无递归):

int非致命约瑟夫(int儿童,int n){
int结果=0;

对于(int i=2;我很抱歉,他们不是从一个随机的起始位置开始的吗?在你的例子中,如果没有起始位置,怎么可能给出任何确定的答案?这是约瑟夫的问题,只是没有杀人。@Littlebbytables:并不是所有人都致力于“被捕前死亡”的原因就像那些想出这个狡猾计划的人一样。@DanielFischer“第n个地点的孩子被消灭了……直到剩下一个孩子。”——你确定“不杀人”吗部分?@Juan Lopes-谢谢,我正在尝试手动计算每轮淘汰的儿童的索引,它们似乎与递归关系返回的结果不匹配,但最终的答案确实匹配。你能帮助解释更多关于递归关系t(c)的内容吗“是什么?c是什么?”goldenmean在答案中添加了重复解释。
T(1) = 0
T(c) = (T(c-1)+n) mod c
int non_fatal_josephus(int children, int n) {
    int result = 0;
    for(int i=2; i<=children; i++)
        result = (result + n) % i;

    return result + 1; //to make it one-based
}