Javaインデックス値によるジョセフループの実装
1133 ワード
问题描述:N人は1周して、最初の人から报数を始めて、mに报告した人はサークルを出て、残りの人は引き続き1から报数を始めて、mに报告した人はサークルを出ます;このように往復して、すべての人が輪を出るまで
多くの実装はチェーンテーブル構造を使用して、要素に1つの輪を構成させて、私は底層が配列のArrayList集合を使用して実現して、しかも遍歴検索を必要としないで、配列の特性に頼って:インデックス値、数学の計算を通じて、インデックス値に1つの輪を構成させて、毎回計算したインデックス値、対応するその要素はきっと次のアウトの要素です
このように,n個の要素があれば,n回の計算,n回の削除,検索を必要とせず,プログラムの時間を最大限に最適化するだけである.
多くの実装はチェーンテーブル構造を使用して、要素に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();
}
}
}
}