4、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,再从他的下一个人重新报数,问最后留下的是原来第几号的那位?
public class Test {
public static void main(String[] args) {
int peo;
System.out.println("请输入人数:");
Scanner inp = new Scanner(System.in);
peo = inp.nextInt();
int k = Keeper(peo, 3);
System.out.println("最后留下的是 " + k + " 号!");
}
public static int Keeper(int peo, int n) {
int k = 0;
int[] array = new int[peo];
for (int i = 1; i < peo; i++) {
int j = 1;
while (j <= n) {
if (      1      ) {
j--;
}
if (j == n) {
2                  ;
}
j++;
            3         ;
}
}
for (k = 0; k < peo; k++) {
if (array[k] == 0) {
      4             ;
}
}
return k + 1;
}
}

解决方案 »

  1.   


    package hashMap;import java.util.Scanner;public class C { // 4、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
    // 凡报到3的人退出圈子,再从他的下一个人重新报数,问最后留下的是原来第几号的那位?
    public static void main(String[] args) {
    int peo;
    // System.out.println("请输入人数:");
    // Scanner inp = new Scanner(System.in);
    // peo = inp.nextInt();
    int k = Keeper(14, 3);// 2
    System.out.println("最后留下的是 " + k + " 号!");
    } public static int Keeper(int peo, int n) {
    int k = 0;
    int[] array = new int[peo];
    for (int i = 1; i <= peo;) {// 只循环一遍?
    int j = 1;
    while (j <= n) {
    if (array[i - 1] == 1) {
    j--;
    }
    if (j == n) {
    array[i - 1] = 1;// 出圈人的位置置为0
    k++;// 已出圈人数+1
    printArray(array);
    }
    j++;
    // 思路如下:
    // 1.已出圈人数是否是还剩一个人?
    // 2.如果是就把i置为可以跳出外层循环的peo+1(外层循环的条件为:i <= peo)
    // 3.否则,判断i(数组下标)的值:是到了数组末尾吗?
    // 4.是:把i的值重新置为1;不让外层循环结束,继续循环
    // 5.否:i的值+1,继续数数
    i = k == peo - 1 ? peo + 1 : (i == peo ? 1 : i + 1);// 在这里回头和出外层循环
    }
    }
    for (k = 0; k < peo; k++) {
    if (array[k] == 0) {// 其他全部置为1了
    break;
    }
    }
    return k + 1;
    } private static void printArray(int[] array) {
    System.out.println("当前数组情况:");
    for (int i = 0; i < array.length; i++) {
    System.out.print(array[i] + "  ");
    }
    System.out.println("*********************************");
    }}
    其中这一句代码,非常精妙:i = k == peo - 1 ? peo + 1 : (i == peo ? 1 : i + 1);// 在这里回头和出外层循环
      

  2.   

    用LinkedList五行代码。