约瑟夫环

来源:互联网 发布:淘宝登录界面刷不出来 编辑:程序博客网 时间:2024/06/11 18:32

问题描述:

已知n个人(编号1~n)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,最后一个出列的人的编号?


解法一:

来自喜安宁乐
模拟此过程,依次出队

https://www.zhihu.com/question/20065611

解法二:

建立一种映射关系
n个人时,出去一人后,重新编号,转化为n-1人的情况

1 2 … m-1 m+1 … n-1 n n-m+1 n-m+2 … n-1 1 … n-m-1 n-m

[f(n-1) + m] % n = f(n)
依上述关系,得到如下递归函数

int Josephus (int n, int m){    int last = 1; //只有一个人的情况    for (int i = 2; i <= n; i++) {        last = (last + m) % i;        if (last == 0) //特殊情况            last = i;    }       return last;} //亦或改变编号,从0开始,加一点小改动即可
原创粉丝点击