有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.length; 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<arrMoney.length; j++) {
if(arrMoney[j]) {
System.out.println("还在圈子里的猴子在数组中的下标是:" + j);
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值