有一个灯泡问题,100个人执行一项任务。有人实现了解决此问题的代码:
boolean[] bulbs = new boolean[100];
for(int i = 1; i < bulbs.length; i++){//loops through people我的问题是,这段代码不是只循环了99个人吗?
如果你对最初的问题感兴趣,它是这样的:
在一间长长的房间里,有100个灯泡排成一排。每个灯泡都有自己的开关,目前已关闭。这个房间有一个入口和一个出口门。入口处有100人排队。每个灯泡从1到100连续编号。每个人都是。 一号人进入房间,打开每个灯泡,然后离开。第二人进入并按下开关每秒钟灯泡(关闭灯泡2,4,6.)。3号人进入并按下每三个灯泡上的开关(改变灯泡3、6、9的状态.)。这种情况一直持续到100人都通过了这个房间。 第64号灯泡的最终状态是什么?在第100个人穿过房间后,有多少灯泡被亮了?
另外,如果您感兴趣,代码的全部内容是:
boolean[] bulbs = new boolean[100];
for(int i = 1; i < bulbs.length; i++){//loops through people
for(int j = 0; j<bulbs.length;j+=i){//loops through bulbs
bulbs[j] = !bulbs[j];
}
}
//print out all the "on" bulbs
for(int i = 1; i<bulbs.length;i++){
if(bulbs[i]){
System.out.println(i + ": "+ bulbs[i]);
}
}发布于 2015-06-20 22:26:52
不,不应该将我初始化为0,因为这意味着在下一条规则中:
for (int j=0; j<bulbs.length;j+=i)J将无限期地保持在0上。
我确实认为:
for(int i = 1; i < bulbs.length; i++)应成为:
for(int i = 1; i <= bulbs.length; i++)所以它实际上从1循环到100,而不是1-99。
至于最后一部分:第64号灯泡的最终状态是什么?在第100个人穿过房间后,有多少灯泡被亮了?
System.out.println("State bulb 64: " + bulbs[63]); // if we assume bulbs[0] is considered as bulb number 1
int count = 0;
for (int i=0; i<bulbs.length; i++) {
if (bulbs[i])
count++;
}
System.out.println("# lightbulbs on:" + count);发布于 2015-06-20 21:52:06
是。应该将i初始化为零,而不是一个,以循环整个数组。
发布于 2015-06-20 23:51:21
您的问题产生于这样一个事实:您的人员和灯泡从1向上编号,但是数组从0向上索引。
1简单的解决方案可能是创建一个由101个索引组成的数组,而不使用第一个索引(将其设置为false,这样灯泡就永远不会被激活,并且不会影响最终激活灯泡数量的结果)。
或者,您可以保留由100个索引组成的数组,并在每次寻址某个人或一个灯泡时,在索引和人员/灯泡号之间进行转换。守则将成为:
for (int i = 0; i < bulbs.length; i++)
for (int j = i; j < bulbs.length; j = j + i + 1)
bulbs[j] = !bulbs[j];这样:-所有100人都进入房间(第一圈)-灯泡上方的回路按人的数字步进(例如,人nr 1有索引O,所以"j =j+i+ 1“在每一步中增加1,人2有索引1,所以"j =j+i+ 1”在每一步中增加j 2,等等)
注:灯泡上的循环必须从"i“开始,而不是从" 0”开始,否则每个人将切换第一个灯泡,然后每个n个灯泡(例如,person 2将切换索引0、2、4、.它们是灯泡nr 1,3,5等,由于人/灯泡编号和索引之间的差异),用我的代码,person 1(索引0)将切换所有灯泡-- person 2(索引1)将切换索引1,3,5,.那是灯泡2,4,6,..
https://stackoverflow.com/questions/30959230
复制相似问题