约瑟夫问题(又称丢手绢问题)


    据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行

import java.util.ArrayList;
import java.util.List;


/**
 * 约瑟夫环问题
 * 
 * @author LuoJoy
 *
 */
public class Test02 {


	public static void main(String[] args) {
		getLuckyNum(8, 3);
	}


	private static void getLuckyNum(int num, int n) {
		// 创建集合用于存储1-num的对象
		List<Integer> list = new ArrayList<>();
		// 将1-num的数存到集合中
		for (int i = 1; i <= num; i++) {
			list.add(i);
		}
		// 定义一个计数器,用来计数,只要是能被n整除的数就移除
		int count = 1;
		// 只要集合中的对象数超过1就要不断的循环计数移除,直到剩下最后一个
		for (int i = 0; list.size() != 1; i++) {
			// 如果i增长到集合最大索引+1时就重新归零
			if (i == list.size()) {
				i = 0;
			}
			if (count % n == 0) {
				list.remove(i--);
			}
			count++;
		}
		System.out.println(list.get(0));
	}
}


猜你喜欢

转载自blog.csdn.net/luo609630199/article/details/80727238