import java.util.Scanner;
/**
* 有N个猴子围成一圈,从1~n进行报数,当报数到n的那个猴子退出循环圈,下次继续从1进行报数
* 查找最后还在循环圈里的猴子是哪一个
* @author PiPiJun
*
*/
public class MonkeyCircle {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("请输入猴子的个数:");
int monkeyNum = s.nextInt();
System.out.println("请输入数到几退出循环圈:");
int n = s.nextInt();
//创建有monkeyNum个数量的猴子的数组,使用boolean类型
boolean[] arrMoney = new boolean[monkeyNum];
//开始每个猴子都在圈里,将其置为true,当不在圈子里的时候,置为false
//初始化,先将其置为true
for(int i=0; i
arrMoney[i] = true;
}
int leftCount = monkeyNum; //剩下的猴子个数
int count = 0;
//用来数数,从1~n
int i = -1;
//方便访问arrMoney
while(leftCount > 1) {
i++;
//i一直增加,会导致数组越界
if(i >= arrMoney.length) {
i = 0;
}
//当此处的猴子还在圈子里的时候,就数数,否则跳过当前位置,防止数组越界,也可以是由取模的方法。
if(arrMoney[i/*%arrMoney.length*/]) {
count++;
}
//当数到n的时候,圈子里猴子的个数减少1,将此处的数组值置为false
if(count == n ) {
arrMoney[i/*%arrMoney.length*/] = false;
count = 0; //再将count置于0
leftCount--; //剩下的猴子少一个
}
}
for(int j=0; j
if(arrMoney[j]) {
System.out.println("还在圈子里的猴子在数组中的下标是:" + j);
}
}
}
}