题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 JAVA实现

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

//题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
//思路:循环三次报数,让第三次报数的那个人退出队列,如果下一个报数的人超出了队列长度就从零号开始报数
public class Democx37significant {
     
    public static void main(String[] args){
     
        Scanner console = new Scanner(System.in);
        System.out.println("请输入人数:");
        int n = console.nextInt();
        //定义一个数组a,长度为n,元素初始值为1
        int[] a = new int[n];
        int[] b = new int[n];//定义一个数组b,默认值为0,用于判断a是否全部归零
        int  i;
        for(i = 0; i < n; i++){
     
            a[i] = 1;
        }
        i = 0;//赋值完后将i归零
        //当数组中有元素不为零时继续循环,为零则表示全部人都退出了队列
        while(!Arrays.equals(a, b)){
     
            //每次循环数3次,从0~2,每数到2将对应的a[i]赋值0表示退出队列
            for(int j = 0; j < 3; j++){
     
                if(a[i] == 1 && j == 2){
      //将第三次报数的未被归零的a[i]赋值为0
                    a[i] = 0;
                }
                else if(a[i] == 0){
      //如果报数的a[i]已经归零说明已经退出队列
                    j--;//当做没有数过这个a[i]
                }
                if(++i >= n){
     //判断是否超出成员人数
                    i = 0;//从零号开始报数
                }
            }
        }
        System.out.println("最后剩下" + i + "号");
      //输出的为最后一次归零的元素下标加1,因为数组是从零开始的所以就是最后留下的人的编号
    }
}

你可能感兴趣的:(基础编程题,java,intellij,idea)