有N个猴子围成一圈,从1~n进行报数,当报数到n的那个猴子退出循环圈,下次继续从1进行报数, 查找最后还在循环圈里的猴子是哪一个猴子

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);
}
}
}
}

你可能感兴趣的:(Java算法)