Javaインデックス値によるジョセフループの実装


问题描述:N人は1周して、最初の人から报数を始めて、mに报告した人はサークルを出て、残りの人は引き続き1から报数を始めて、mに报告した人はサークルを出ます;このように往復して、すべての人が輪を出るまで
多くの実装はチェーンテーブル構造を使用して、要素に1つの輪を構成させて、私は底層が配列のArrayList集合を使用して実現して、しかも遍歴検索を必要としないで、配列の特性に頼って:インデックス値、数学の計算を通じて、インデックス値に1つの輪を構成させて、毎回計算したインデックス値、対応するその要素はきっと次のアウトの要素です
このように,n個の要素があれば,n回の計算,n回の削除,検索を必要とせず,プログラムの時間を最大限に最適化するだけである.
 
 
import java.util.ArrayList;
import java.util.Scanner;
public class     3 {
	public static void main(String[] args) {
		/*    :N      ,         ,  m    ,
		       1    ,  m    ;    ,       */
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();//n  
		int m = sc.nextInt();//m   
		int count = m;
		ArrayList list = new ArrayList();
		for(int i = 1 ; i <= n  ; i++){
			list.add(i);
		}
			for(; ;){
				if(list.size() == 1){
					System.out.print(list.get(0) + " ");
					return;
				}
				if(m <= list.size()){
					System.out.print(list.get(m-1) + " ");
					list.remove(m-1);
					m += count -1;
				
				}				
				if(list.size() < m){
					m = m - list.size();
				}
			}
	}
}