这是约瑟夫斯问题的一种解决方案(人们围成一圈,其他人都被杀死,直到只剩下一个人):
import java.util.ArrayList;
public class test {
public static void main(String[] args) {
ArrayList<Integer> chairArr = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
chairArr.add(i);
}
int result = 0;
for (int i = 1; i < chairArr.size() - 1; i = i + 2) {
chairArr.add(chairArr.get(i));
result = i;
}
System.out.print("Result: " + chairArr.get(result));
}
}
但是,如果我们不是跳过所有其他人,而是增加跳过的人数,该怎么办?也就是说,如果10个人围成一圈,则依次杀死1、3、6、10等人。我认为修改会出现在i = i + 2
for 循环中,但我不确定。
我在纸上算出来了,这是消除的顺序,其中星号表示要删除的数字:
0 *1* 2 3 4 5 6 7 8 9 10
1 2 *3* 4 5 6 7 8 9 10
2 2 4 5 *6* 7 8 9 10
3 2 4 5 7 8 9 *10*
4 2 4 5 7 *8* 9
5 2 4 5 7 *9*
6 2 4 *5* 7
7 *2* 4 7
8 *4* 7
9 7 <-- Result
想法?
编辑:尝试了对 for 循环的这种修改:
for (int j = 2; j < chairArr.size() - 1; j++) {
for (int i = 1; i < chairArr.size() - 1; i = i + j) {
chairArr.add(chairArr.get(i));
result = i;
}
}
这不起作用,因为在 j = 2 的初始传递之后,内部循环已经将列表缩小到一个候选者,因此外部循环永远不会完成。