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

来源:互联网 发布:知牛财经房间骗局 编辑:程序博客网 时间:2024/05/16 12:03

题目
一群猴子要选新猴王。新猴王的选择方法是:让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