【蓝桥杯】【猴子选大王】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bear_huangzhen/article/details/78518549

题目
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。
从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。
如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7

分析
使用数组模拟一圈猴子,下标代表编号,由于数组的下标是从0开始的,所以1~N对应成数组的下标是0~(N-1)
设计三个变量,一个下标变量,一个报数变量,一个记录还在圈子中的猴子数量的变量。。

源码

        public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.close();

        int[] a = new int[N];
        int index = 0; 
        int i = 1; //报数变量
        int counter = N; //记录删除了多少个

        while(counter > 1) {

            if(a[index] == -1) {
                //说明是无效的猴子
            }else {
                //说明是有效的猴子

                //如果报数为3,就将元素的值置为-1,表示退出了圈子
                if(i == 3) {
                    a[index] = -1;
                    counter--; //猴子数量-1
                }

                //为下一次报数做准备
                i++;
                if(i==4) {
                    i=1;
                }
            }

            //指向下一个元素
            index++;
            if(index == N) {
                index = 0;
            }

        }

        for (int j = 0; j < a.length; j++) {
            if(a[j] != -1) {
                //找到了猴王
                System.out.println(j+1);
                break;
            }
        }
    }

结果
11
7

猜你喜欢

转载自blog.csdn.net/bear_huangzhen/article/details/78518549