5.15个猴子围成一圈选大王,依次1-7循环报数,报到7的猴子被淘汰, 直到最后一只猴子成为大王。问:哪只猴子会成为大王?
- 猴子编号:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- 淘汰顺序:7 14 6 15 9 3 13 11 10 12 2 8 1 4
- 猴王:5
代码和注释
方法1
package cn.tedu.answer;
import java.util.Arrays;
public class Answer5 {
public static void main(String[] args) {
//定义猴子数组,数组值为其编号
int[] monkeys={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int counter=0; //计数器--到7时,对数组进行操作并将counter清零
while(monkeys.length!=1){//一直执行剔除猴子的操作,直到选出猴王
int a = 0;//计数器--计数被剔除的猴子
for(int i=0;i<monkeys.length;i++){//在猴群中遍历
counter++;
if(counter==7){//当计数器为7
System.out.println(monkeys[i]);
monkeys[i]=0;//把报数7的猴子剔除
a++;//被剔除的猴子数量加1
counter=0;//从0重新开始循环
}
}
//定义新数组,将剔除后的猴群转入新数组
int[] newmonkeys=new int[monkeys.length-a];
int index=0;//新数组下标
for(int i=0;i<monkeys.length;i++){//遍历旧数组
if(monkeys[i]!=0){//将剩下的猴子转入新数组
newmonkeys[index++]=monkeys[i];
}
}
//将新数组赋值给旧数组,重新开始上方剔除猴子的操作
monkeys=newmonkeys;
}
//输出猴王编号
System.out.println(Arrays.toString(monkeys));
}
}
方法2
public class Answer5{
public static void main(String[] args) {
//用boolean数组去标志猴子的状态
boolean[] b=new boolean[15];
//初始化数组--未淘汰的状态为true
for(int i=0;i<b.length;i++){
b[i]=true;
}
//剩余的猴子数
int monkeyLeft=15;
//报数
int num=0;
//数组的下标
int index=0;
//循环报数
while(monkeyLeft>1){
//判断猴子是否被淘汰
if(b[index]){
//没有被淘汰,就报数
num++;
//数到7淘汰
if(num==7){
//猴子减一
monkeyLeft--;
//转变状态
b[index]=false;
//num为0
num=0;
}
}
//下标后移
index++;
//保证下标不越界
if(index==15){
index=0;
}
}
//输出
for(int i=0;i<b.length;i++){
if(b[i]){
System.out.println(i+1);
}
}
}
}