/*
* n个人(编号1~n)围成一圈从编号为1的开始报数,从1报数到m,报到m的人出来,
* 下一个人继续重新从1开始报数,编程求最后一个留下的人的编号;
* 如n=3,m=4;
* 第一次出队:1;
* 第二次出队:3;
* 最后留下:2;
*/
> 解题思路:通过boolean数组,true与false的关系巧妙解决
- 代码如下:
public static void main(String[] args) {
Scanner sr=new Scanner(System.in);
int n=sr.nextInt();
int m=sr.nextInt();
//int n=3; int m=4; //用于测试
//调用
BaoShu(n, m);
}
//封装一个方法
public static void BaoShu(int n,int m) {
//首先定义一个boolean数组,让它的长度为n(编号1~n),值为true;
boolean[] bln=new boolean[n];
for (int i = 0; i < bln.length; i++) {
bln[i]=true;
}
//初始化两个变量,count用来计数,chang等于数组的长度;
int count=0; int chang=bln.length;
//这里用while循环,判断长度大于1的情况运行,小于等于1就会自动停止循环;
while(chang>1) {
//遍历数组从第一个开始计数;
for (int i = 0; i < bln.length; i++) {
if(bln[i]) {
count++; //每次判断+1;
if(count==m) { //当计数等于m时,计数清零继续从当前位置进行数数;
count=0;
bln[i]=false; //让等于m的数值为false,并长度减一;
chang--;
}
}
}
}
//遍历数组,判断为true的数值,输出其位置,也就是数组的下角标((下角标从0开始的,所有要加一)
for (int i = 0; i < bln.length; i++) {
if(bln[i]) {
System.out.println("最后一个人留下的编号是:"+(i+1)+"号");
}
}
}