求教:逢3退1哪里出错了?

a673921712 2013-06-23 02:17:39
折腾了很久,还是没有发现问题根源,希望大家能帮我找出问题所在。
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) + "个");
}
}
}
}
...全文
292 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
FFF9527 2013-06-24
  • 打赏
  • 举报
回复
引用 7 楼 friskyliu 的回复:


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;
    }
}

计数器归0的可以对上面的代码稍加修改即可。
FFF9527 2013-06-24
  • 打赏
  • 举报
回复


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;
    }
}

a673921712 2013-06-23
  • 打赏
  • 举报
回复
引用 2 楼 FirstHelloWorld 的回复:
你将leftCount > 1作为判断条件,计算的次数可不仅仅是500,而是1500次,这样就会造成覆盖的当然不会得到正确的结果了。 改正方法有两种: 1、将while的判断条件改为index<arr.length (当然了,对if中的index判断就没用了,可以去掉) 2,将
 if(index == arr.length) {
                index = 0;
            }
改为
 if(index == arr.length) {
                break;
            }
谢谢,问题就出在: if(arr[index] = true) 这里应该是:“==”,其它没有问题。兄弟下面的那个程序不知道你编译运行了没有,你的思路首先就是错误的。
流星陨落 2013-06-23
  • 打赏
  • 举报
回复
zhangxm2015 2013-06-23
  • 打赏
  • 举报
回复
对了楼主这句
    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) + "个");
			}
		}
	}
}

zhangxm2015 2013-06-23
  • 打赏
  • 举报
回复
你将leftCount > 1作为判断条件,计算的次数可不仅仅是500,而是1500次,这样就会造成覆盖的当然不会得到正确的结果了。 改正方法有两种: 1、将while的判断条件改为index<arr.length (当然了,对if中的index判断就没用了,可以去掉) 2,将
 if(index == arr.length) {
                index = 0;
            }
改为
 if(index == arr.length) {
                break;
            }
李小西033 2013-06-23
  • 打赏
  • 举报
回复
if(countNum == 3) {
                    countNum = 0;
                    arr[index] = false;
                    leftCount --;
                }
应该是if(countNum==2)从0开始数到2是第三个数字
zhangxm2015 2013-06-23
  • 打赏
  • 举报
回复
引用 5 楼 a673921712 的回复:
[quote=引用 2 楼 FirstHelloWorld 的回复:] 你将leftCount > 1作为判断条件,计算的次数可不仅仅是500,而是1500次,这样就会造成覆盖的当然不会得到正确的结果了。 改正方法有两种: 1、将while的判断条件改为index<arr.length (当然了,对if中的index判断就没用了,可以去掉) 2,将
 if(index == arr.length) {
                index = 0;
            }
改为
 if(index == arr.length) {
                break;
            }
谢谢,问题就出在: if(arr[index] = true) 这里应该是:“==”,其它没有问题。兄弟下面的那个程序不知道你编译运行了没有,你的思路首先就是错误的。[/quote] 抱歉啊!还以为你要的是将3,6,9,12等都删除呢? 原来是约瑟夫循环啊! 看来我还是太年青啊!!万分抱歉!!!

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧