`
jaychang
  • 浏览: 728228 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

约瑟夫出圈

阅读更多
import java.util.ArrayList;
import java.util.List;

public class JosephOutOfCircle{
	private static void initialize(List<Integer> list, int personNum) {
		for (int i = 0; i < personNum; i++) {
			list.add(i + 1);
		}
		System.out.println(list);
	}
        
     //personNum总人数,报step的出圈
     public static void process(int personNum, int step) {
		List<Integer> list = new ArrayList<Integer>();
		int index = 0;
		initialize(list, personNum);
		while (list.size() > 0) {
			for (int i = 1; i <= step; i++) {
				if (i % step == 0) {
					System.out.print(list.get(index) + " ");
					if (index == list.size() - 1) {
						index = 0;
						list.remove(list.size() - 1);
					} else {
						list.remove(index);
					}
				} else {
					index = (index == list.size() - 1) ? 0 : ++index;
				}
			}
		}
	}
}

   约瑟夫环问题

  约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起 义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些叛乱者表决说 “要投降毋宁死”。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签,并且,作为洞穴中的两个幸存者 之一,他说服了他原先的牺牲品一起投降了罗马。
  约瑟夫环问题的具体描述是:设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m 的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人 出圈的次序。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics