版权声明:本文为博主原创文章,未经博主允许不得转载。 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