N个人围成一圈,顺序编号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,下一个人接着报数。假设N为25,求最后留下来的人的编号?

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) + "的学生");
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值