public class Q10 {
public static void main(String[] args) {
//定义一个长度为25的boolean类型数组,用25个数据代表25个人,
//true表示留下的人,false代表出局的人
boolean[] arr=new boolean[25];
//报数前,25个人都在,都是true
for(int i=0;i<25;i++){
arr[i]=true;
}
//定义一个变量 i 作为数组的索引,模拟每个人的编号
//初始化值定为24,为后面(i++%arr.length)的开始值为0铺垫
int i=24;
//定义一个变量 j 作为报的数,
// 每当 j 为三时,与之对应的数据arr[i]变为false
//代表对应索引的人出局
int j=0;
//每出局一个人,数组长度发生改变,定义变量n代表数组的实时长度
int n=arr.length;
//设定一个while循环,模拟循环报数
//因为循环报数的人只剩1个时,选举结束,即循环报数的前提是人数大于1
//所以while循环的前提是数组长度(也即 n)大于1
while(n>1){
//用变量 i的自增模拟报数从一个人传到另一个人的过程
//当i=arr.length时,i%arr.length=0,模拟所有人结束一圈报数
i= ++i%arr.length;
//当arr[i]为false,j++不执行,模拟出局的人失去报数权
if(arr[i]){
//j++模拟报数
j++;
// 每当 j 为三时,与之对应的数据arr[i]变为false
//代表对应索引的人出局
if(j==3){
arr[i]=false;
//此时,数组长度减一,用变量的自减实现
n--;
//报数 j到3之后,又要从一开始,这个过程用变量的重新赋值实现
j=0;
}
}
}
//找到最后那个没出局的人的编号,即唯一的true,ta就是班长
for(int a=0;a<25;a++){
if(arr[a]){
System.out.println("班长是原来编号为" + (a+ 1) + "的学生");
}
}
}
}
N个人围成一圈,顺序编号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,下一个人接着报数。假设N为25,求最后留下来的人的编号?
最新推荐文章于 2024-08-19 09:44:39 发布