【基础试题】约瑟夫环问题
Time Limit:1000MS Memory Limit:65536K
Total Submit:421 Accepted:281
Description
有M个人,其编号分别为1-M。这M个人按顺序排成一个圈(如图)。现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然后又从下一个人开始又从1开始依次报数,数到N的人又出列...如此循环,直到最后一个人出列为止。
Input
输入只有一行,包括2个整数M,N。之间用一个空格分开(0 < n <= m <= 100)。
Output
输出只有一行,包括M个整数
Sample Input
8 5
Sample Output
5 2 8 7 1 4 6 3
Source
xinyue
public class test2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入总人数:");
int totalNum = scanner.nextInt();
System.out.print("请输入报数的大小:");
int cycleNum = scanner.nextInt();
yuesefu(totalNum, cycleNum);
}
public static void yuesefu(int totalNum, int countNum) {
// 初始化人数
List start = new ArrayList();
for (int i = 1; i <= totalNum; i++) {
start.add(i);
}
//从第K个开始计数
int k = 0;
while (start.size() >0) {
k = k + countNum;
//第m人的索引位置
k = k % (start.size()) - 1;
// 判断是否到队尾
if (k < 0) {
System.out.println(start.get(start.size()-1));
start.remove(start.size() - 1);
k = 0;
} else {
System.out.println(start.get(k));
start.remove(k);
}
}
}
}
写了个比较笨的方法
public static void showMessage(int m,int n){
if(n>m)return;
String info = "";
for(int i=1;i<=m;i++){
for (int j = 1; j <= m; j++) {
info+=j;
}
}
for (int i = 0; i < m; i++) {
String reslt =info.substring(n-1, n);
info = info.substring(n)+info.substring(0, n-1);
info = info.replaceAll(reslt, "");
System.out.print(reslt+" ");
}
}
/**
*
* @param n 几只猴
* @param k 数到几
* @param begin 从第几只开始
*/
public static void test(int n, int k, int begin) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < n; i++) {
list.add(String.valueOf(i + 1));
}
int lastChuju = 0;
boolean isBegin = true;
while (list.size() > 1) {
int size = list.size();
if (isBegin) {
isBegin = false;
lastChuju = k + begin;
} else {
lastChuju = lastChuju + k;
}
if (lastChuju > size) {
lastChuju = lastChuju % size;
}
lastChuju -= 1;
System.out.println("猴子出局: " + list.get(lastChuju));
list.remove(lastChuju);
}
System.out.println("猴子大王:" + list.get(0));
}