有一个灯泡问题,其中100人执行任务。有人实现了代码来解决这个问题:
boolean[] bulbs = new boolean[100];
for(int i = 1; i < bulbs.length; i++){//loops through people
我的问题是;这条代码只能循环到99个人吗?
如果您对原始问题感兴趣,可以这样:
在长长的房间里,有100个灯泡排成一排。每个灯泡 有自己的开关,目前已关闭。房间有一个 入口门和出口门。外面有100人排队 入口门。每个灯泡从1到100连续编号。也是如此 每个人。
1号人进入房间,打开每个灯泡,然后退出。 2号人员每隔一个灯泡进入并翻转开关(转动 关掉灯泡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]);
}
}
答案 0 :(得分:4)
是。 i
应初始化为零,而不是一个,以遍历整个数组。
答案 1 :(得分:2)
你的问题来自你的人和灯泡从1向上编号,但你的阵列从0向上编号。
一个简单的解决方案可能是您创建了一个包含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,因此&#34; j = j + i + 1&#34;在每一步中将j增加1,人2具有索引1,因此&#34; j = j + i + 1& #34;在每一步中将j增加2,依此类推)
注意:灯泡上的循环必须从&#34; i&#34;而不是来自&#34; 0&#34;否则每个人都会切换第一个灯泡,然后是每个第n个灯泡 (例如,由于人/灯泡编号和索引之间的差异,人2将切换索引0,2,4 ......,这些是灯泡nr 1,3,5等) 使用我的代码,人1(索引0)将切换所有灯泡 人2(索引1)将切换索引1,3,5,...,这是灯泡2,4,6,...
答案 2 :(得分:1)
不,我不应该初始化为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);