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;
}
}
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);// 在这里回头和出外层循环