n人围成一圈。从第一人报数,数到第m的人出列,然后从出列的下一人重新报数,直到最后一人
简化版的Josephus问题(约瑟夫问题)。
在Java里可以创建一个链表,使用取余的方法依次从链表里移除元素,最后只剩下最后一个元素。
import java.util.*;
import java.util.Scanner;
public class Test {
public static void main(String[] arg) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
//传入n,m
//n为总人数,m为报数的次数
Josephuse.Lastnum(n,m);
}
}
class Josephuse{
public static void Lastnum(int n,int m){
//创建链表。泛型不能是基本数据类型,所以在Java里只能是类了
List<Integer> list=new LinkedList();
for (int i=0;i<n;i++){
list.add(i);
}
int index=0;
while(list.size()>1){
//报m次数,实际上是开始人后m-1人出局,如:报2次数是第二人出局
index=(index+m-1)%list.size();
System.out.println(list.get(index)+1);
list.remove(index);
}
System.out.println(list.get(0)+1);
}
}