ShineYoung

导航

 

约瑟夫环问题我首先想到的就是数组模拟,其实也有想过这是有规律的,可以递归求解,但是忘了😂

1.先来说说数组模拟,思想很简单,就是m个人,报数为n的人出圈,即打个标记,遇到这个标记就跳过,直到最后一个人为止,上代码。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        int m = 0;//总人数
        int n = 0;//报数
        Scanner in = new Scanner(System.in);
        m = in.nextInt();
        in.nextLine();
        n = in.nextInt();
        int[] num = new int[m];
        int count = 0;//出圈人数
        int pos = 0;//位置
        while(n > 0) {
            for (int i = 0; i < num.length; i++) {
                if(num[i] == 0) {
                    pos++;
                    if(pos == n) {
                        num[i] = 1;
                        pos = 0;
                        System.out.println("第"+ i +"号出圈");
                    }
                }
            }
            
        }
    }
}

 

上面第一中方法如果m和n的数字小还好,如果很大的话要花费的时间就很长了,所以下面递归求解是比较好的方法

import java.util.*;

public class Main {
    public static void main(String[] args) {
        int m = 0;//总人数
        int n = 0;//报数
        Scanner in = new Scanner(System.in);
        m = in.nextInt();
        in.nextLine();
        n = in.nextInt();
        int pos = 0;
        /*
        int[] num = new int[m];
        int count = 0;//出圈人数
        int pos = 0;//位置
        while(n > 0) {
            for (int i = 0; i < num.length; i++) {
                if(num[i] == 0) {
                    pos++;
                    if(pos == n) {
                        num[i] = 1;
                        pos = 0;
                        System.out.println("第"+ i +"号出圈");
                    }
                }
            }
        }
        */
        //这个递推公式只能求最后一个出圈的人
        //参考网址https://blog.csdn.net/u011500062/article/details/72855826
        //参考公式f(m,n) = (f(m-1,n) + n)%m
        //m人数 n报数
        for(int i=2; i<=m; i++) {
            pos = (pos+n)%i;
        }
        //当有m个人,报数为n出圈,最后一个离场的人的下标
        System.out.println(pos);
    }
}

 

posted on 2019-03-08 13:21  ShineYoung  阅读(193)  评论(0编辑  收藏  举报