package com.seqlist;
import java.util.*;
public class yuesefu {
/**
* @约瑟夫环
* 总人数 totalnum
* 数到几 countnum
* 第几个出列 k
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int totalnum=11;
int countnum=6;
List<Integer> list=new ArrayList();
//初始化人数
for(int i=1;i<=totalnum;i++){
list.add(i);
}
int k=0;
//开始数数了
while(list.size()>0){
//确定出列值k
k=k+countnum;
//k的最后一个数 ???
k=k%list.size()-1;
//判断是否队尾,k在队伍最后一个数时会有k<0
if(k<0){
//处于队尾元素
System.out.println(list.get(list.size()-1));
list.remove(list.size()-1);
k=0;
}else{
//
System.out.print(list.get(k)+" ");
list.remove(k);
}
}
}
}
今天也有一个同学问约瑟夫问题,看到这个好像明白了。其实这个K可以理解为数数开始时前面有几个人,每次循环的时候需要计算从第几个人开始数,然后加上数到几删掉一个,这个时候有可能已经从末尾回到最前面了,因此要进行取模运算。