`
gybmike
  • 浏览: 179956 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

约瑟夫环的java实现

    博客分类:
  • java
 
阅读更多
题目:


引用
据说著名犹太历史学家 约瑟夫有过以下的故事:
在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫 和他的朋友并不想遵从,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。


我的答案:


package test;

import java.util.ArrayList;;

public class CircleTest {
	int m; //总人数
	int n; //第几个出局
	ArrayList<String> circle = new ArrayList <String>();

	public CircleTest(int m, int n) {
		this.m = m;
		this.n =n;
		//初始化环
		for (int i = 1; i <= m; i++) {
			circle.add(String.valueOf(i));
		}
		
		print(circle);
	}

	public void doAction() {
		ArrayList<String> temp = null;
		int k = n;//计数
		while (true) {
			temp = (ArrayList<String>)circle.clone();
			if (temp.size() == 1) {
				System.out.println(temp.get(0)+"\n");//最后一个出局的人
				break;
			}
			for (int i =0; i < temp.size(); i++) { //循环
				k--;
				if (k == 0) {
					System.out.print(temp.get(i)+" ");//打印出局的人
					circle.remove(temp.get(i)); //出局
					k = n; //重新开始计数
				}
			}
		}
	}
	
	
	//打印
	public void print(ArrayList<String> list){
		for(int i=0;i<list.size();i++){
			System.out.print(list.get(i)+" ");
		}
		System.out.print("\n\n");
	}

	public static void main(String args[]) {

		CircleTest test = new CircleTest(41,3);
		test.doAction();
	}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics