折腾了很久,还是没有发现问题根源,希望大家能帮我找出问题所在。
public class Count3Quit {
public static void main(String args[]) {
boolean[] arr = new boolean[500];
for(int i=0; i<arr.length; i++) {
arr[i] = true;
} int leftCount = arr.length;  //队列剩余人数
int index = 0;               //第几个,数到的位置
int countNum = 0;            //计数器,数到3就退1个 while(leftCount > 1) {
if(arr[index] = true) {
countNum ++;
if(countNum == 3) {
countNum = 0;
arr[index] = false;
leftCount --;
}
} index ++; if(index == arr.length) {
index = 0;
}
} /*
测试用:
System.out.println(leftCount);
System.out.println(arr[100]);
System.out.println(arr[101]);
System.out.println(arr[102]);
System.out.println(arr[103]);
System.out.println(arr[104]);
System.out.println(arr[105]);
System.out.println(arr[106]);
System.out.println(arr[107]);
System.out.println(arr[108]);
System.out.println(arr[109]);
System.out.println(arr[110]);
System.out.println(arr[111]);
System.out.println(arr[112]);
System.out.println(arr[255]);
*/


for(int i=0; i<arr.length; i++) {
if(arr[i] == true) {
System.out.println("最后留下来的是第" + String.valueOf(i+1) + "个");
}
}
}
}

解决方案 »

  1.   

    if(countNum == 3) {
                        countNum = 0;
                        arr[index] = false;
                        leftCount --;
                    }
    应该是if(countNum==2)从0开始数到2是第三个数字
      

  2.   

    你将leftCount > 1作为判断条件,计算的次数可不仅仅是500,而是1500次,这样就会造成覆盖的当然不会得到正确的结果了。
    改正方法有两种:
    1、将while的判断条件改为index<arr.length  (当然了,对if中的index判断就没用了,可以去掉)
    2,将 if(index == arr.length) {
                    index = 0;
                }
    改为 if(index == arr.length) {
                    break;
                }
      

  3.   

    对了楼主这句    if(arr[index] = true) {也错了是“==”号,亲下面是我改写的package zhangming.csdn.javase;public class Count3Quit {
    public static void main(String args[]) {
    boolean[] arr = new boolean[500];

    int index = 0;               //索引
    int countNum = 0;            //计数器,数到3归0 while(index < arr.length) {
    if(arr[index] == false) {
    countNum ++;
    if(countNum == 3) {
    countNum = 0;
    arr[index] = true;
    }
    } index ++;
    } for(int i=0; i<arr.length; i++) {
    if(arr[i] == false) {
    System.out.println("最后留下来的是第" + (i+1) + "个");
    }
    }
    }
    }
      

  4.   

    谢谢,问题就出在:
        if(arr[index] = true) 
    这里应该是:“==”,其它没有问题。兄弟下面的那个程序不知道你编译运行了没有,你的思路首先就是错误的。
      

  5.   

    谢谢,问题就出在:
        if(arr[index] = true) 
    这里应该是:“==”,其它没有问题。兄弟下面的那个程序不知道你编译运行了没有,你的思路首先就是错误的。抱歉啊!还以为你要的是将3,6,9,12等都删除呢?
    原来是约瑟夫循环啊!
    看来我还是太年青啊!!万分抱歉!!!
      

  6.   

    public class Test06 {
        /**
         * 500个小朋友围城一圈,从1开始顺时针计数,当遇到3的倍数以及含有3的数字时,
         * 该小朋友需退出游戏,直到剩余一个为止,求该小朋友第一圈计数的编号,计数器一直往上数,不归0。
         */
        public static void main(String[] args) {
            //初始化数组,true为当前剩余数
            boolean [] arr = new boolean[500];
            for(int i = 0;i<arr.length;i++) {
                arr[i] = true;
            }
            
            //当前数数
            int num = 0;
            
            int index = -1;
            while((index = endIndex(arr)) == -1) {
                for(int i = 0;i<arr.length;i++) {
                    if (arr[i]) {
                        num++;
                        if (isMeetThree(num)) {
                            arr[i] = false;
                            
                            //设置一次检查一次,否则跳出循环,防止剩下的NUM都是含有3开头的,例如30,31,32,.....
                            index = endIndex(arr);
                            if (index != -1) {
                                break;
                            }
                        }
                    }
                }
            }
            System.out.println("当前剩余孩子编号:" + (index + 1));
        }
        
        /**
         * 当为3的倍数,以及含有3时,返回true,否则返回false
         */
        public static boolean isMeetThree(int num) {
            if (num % 3 == 0) {
                return true;
            }
            
            return String.valueOf(num).indexOf('3') != -1;
        }
        
        /**
         * 当数组中只含有一个为true时,返回该ture所在位置的index,否则返回-1
         */
        public static int endIndex(boolean[] arr) {
            int index = -1;
            int count = 0;
            for(int i = 0;i< arr.length;i++) {
                if (arr[i]) {
                    if (++count > 1) {
                        return -1;
                    }
                    index = i;
                }
            }
            
            return index;
        }
    }