//<span style="white-space:pre"> </span>方法一:
// /**** 初始化人员 ***/
// boolean[] per = new boolean[n];// boolean数组表示站成一圈的人,false表示退出
// for (int i = 0; i < per.length; i++) {
// per[i] = true;
// }
//
// /**** 报号 ***/
// int t = 0, len = per.length;
// while (len > 1) {
// for (int i = 0; i < per.length; i++) {
// if (per[i]) {
// t++;
// if (t == 3) {
// t = 0;
// per[i] = false;
// len--;
// }
// }
// }
// }
//
// /***** 结果 *****/
// System.out.println("最后的情况:" + Arrays.toString(per));
// for (int i = 0; i < per.length; i++) {
// if (per[i]) {
// System.out.println("留下来的人原来的编号为:" + (i + 1));
// }
// }
//<span style="white-space:pre"> </span>方法二:
boolean[] person = new boolean[n];
for (int i = 0; i < person.length; i++) {
person[i] = true;
}
int numPerson = person.length;
int count = 0;
while (numPerson > 1) {
for (int i = 0; i < person.length; i++) {
if (person[i]) {
count++; //报数
if (count == 3) {
count = 0;
person[i] = false;
numPerson--;
}
}
}
}
System.out.println("the result of array is " + Arrays.toString(person));
for (int i = 0; i < person.length; i++) {
if (person[i]) {
System.out.println("the original order number is " + (i + 1));
}
}
}
算法思路: 围城一圈,则报数是循环的,即从圈尾可以报数到圈头。 推出的人数,让其值置为false或者0. 这样循环时,还是按照原来的数组进行循环,简化问题。 初始条件下,所有人都在圈子里,即所有值为true或者1。 结束条件时,应该只剩下最有一个人,即数组里,只有一个人存在。 循环时,值判断在圈内的人的报数情况,即true或者1的情况。代码如下 public static voi