约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
直接给出代码,欢迎拍砖。
package com.timeng;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Yue {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入总人数");
int totalNum = sc.nextInt();
System.out.println("请输入报数的大小");
int countNum = sc.nextInt();
yuesefu(totalNum,countNum);
}
public static void yuesefu(int totalNum,int countNum){
//初始化人数
List<Integer> 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);
}
//最后输出的数字
if (start.size()==1){
System.out.println("最后一个数字:"+start.get(0));
}
}
}
}
结果:
请输入总人数
5
请输入报数的大小
3
移除的数字位:3
移除的数字位:1
移除的数字位:5
移除的数字位:2
最后一个数字:4
移除的数字位:4