題目:有 n 個人圍成一圈,順序排號。從第一個人開始報數(從 1 到 3 報數),凡報到 3 的人退出圈子,問最後留下的是原來第幾號的那位。
import java.util.Scanner;
public class WangDao {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("Input the n: ");
int n = scan.nextInt();
boolean[] isIn = new boolean[n]; // 用布爾型數組來標記是否在圈內。
for (int i = 0; i < isIn.length; i++) {
isIn[i] = true;
}
int inCircle = n, index = 0, number = 0; // 圈內人數,指標,報數。
while (inCircle > 1) { // 圈內人數剩下1人時退出。
if (isIn[index]) {
number++;
if (number == 3) { // 報數到3時。
number = 0; // 重新報數。
isIn[index] = false; // 標記退圈。
inCircle--; // 圈內人數扣1個。
}
}
index++; // 指標每輪加1. 不可寫成isIn[index++],因爲if內也要用到index,不能提前更變。
if (index == n) { // 如果數到最後一號,重頭再遍歷。
index = 0;
}
}
for (int i = 0; i < isIn.length; i++) {
if (isIn[i]) { // 遍歷到未標記退圈的號數加1,就是活着的人。
System.out.println("Last one is " + (i + 1));
}
}
}
}