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可以理解為數數開始時前面有幾個人,每次循環的時候需要計算從第幾個人開始數,然後加上數到幾刪掉一個,這個時候有可能已經從末尾回到最前面了,因此要進行取模運算。