问题描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人只有一个没有出列。假设n=1000,k=5,m=13,问剩下最后一个人编号。
实现代码:
package JosephProblem;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
/**
*类描述:约瑟夫环问题!
*@author: 张宇
*@date: 日期: 2018年8月16日 时间: 下午9:05:54
*@version 1.0
*/
public class TestJosephProblem {
@Test
public void testJosephProblem(){
int lastNumber=josephProblem(1000,5,13);
System.out.println(lastNumber);
}
//约瑟夫环算法,经典求解,动态减去链表中元素
public int josephProblem(int numberN ,int startNumberK,int numberM){
//定义一个链表,让链表里面存1...1000个数
List<Integer> josephList=new ArrayList<Integer>();
for(int i=1;i<=numberN;i++){
josephList.add(i);
}
int start=startNumberK;
int length=josephList.size();
for(int i=1;i<length;i++){
start=(start+numberM)%josephList.size();
josephList.remove(start);
}
return josephList.get(0);
}
}
运行结果:
939