您的位置:首页 > 其它

约瑟夫环(报数出列)问题

2015-11-06 22:16 246 查看
题目描述

已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

输入

7 3

输出

3 6 2 7 5 1 4

算法思路

先假设,编号是0~n-1,报数是从0~m-1,因为只要在最后结果+1,就变回编号1~n了。

第i=1次报数:A)0 1 2 3 4 5 6,n=7,淘汰2,于是变为0 1 3 4 5 6 ,

接下来报数顺序为:B)3 4 5 6 0 1,n=6

第i=2次报数:C)0 1 2 3 4 5,C变回B,只要(C+m)%n即可,

淘汰2,于是变为0 1 3 4 5,接下来报数顺序为:D)3 4 5 0 1,n=5

第i=3次报数:E)0 1 2 3 4,E变回D,只要(E+m)%n即可

以此类推。。。。

我们可以知道:

第i次淘汰的数可以归纳出下面的递归公式:

f(n,m,i)=[f(n-1,m,i)+m]%n;

当i=1时,f(n,m,1)=(n+m-1)%n;

算法如下

public class LastRemaining {
public int LastRem(int n, int m,int i) {
if(i==1)
return (n+m-1)%n;
else
return (LastRem(n-1,m,i-1)+m)%n;
}
public static void main(String[] args) {
LastRemaining cls = new LastRemaining();
for(int i=1;i<=7;i++)
System.out.println(cls.LastRem(7, 3,i)+1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: