Joseph环问题

来源:互联网 发布:数据库导入数据的方法 编辑:程序博客网 时间:2024/05/18 03:23

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知N个人(以编号1,2,3…N分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们编号0~n-1,最后结果+1即为原问题的解。
输入描述:输入三个数 N, k , m;
1<= k <= N; 1<= m <= N;

import java.util.Scanner;import java.util.List;import java.util.ArrayList;public class JosephCircle {    public static void main(String[] args) {        Scanner input = new Scanner(System.in);        while (input.hasNextInt()) {            int N = input.nextInt();            int k = input.nextInt();            int m = input.nextInt();            List<Integer> list = new ArrayList<>();            for(int i = 0; i < N; i++) {                list.add(i);//0,1,2...N-1代表编号1,2,3...N            }            System.out.println(delete(list, k, m));        }        input.close();    }    private static int delete(List<Integer> list, int k, int m) {        int count = 0;        for (int i = k - 1; i < list.size(); i++) {//第k个人下标为k-1            if (count == m) {                list.remove(i);                i--;                count = 0;            } else {                count++;            }        }        while (list.size() > 1) {            for (int i = 0; i < list.size(); i++) {                if (count == m) {                    list.remove(i);                    i--;//因为删除一个元素,后面元素向前移动一位                    count = 0;                } else {                    count++;                }            }        }        return list.get(0) + 1;//实际编号    }
0 0