编程题目:
62.有n个人围成一圈,数到m和m的倍数时出圈,问剩下的人是谁?在原来的位置是多少?
示例代码:
package program.calculation.exercise62;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 62.有n个人围成一圈,数到m和m的倍数时出圈,问剩下的人是谁?在原来的位置是多少?
*
* 说明:由于每次去掉元素以后,元素的个数会少一个,因此下一个3的倍数其实只需要走两步,
* 在为其下标赋值的时候,需要减一,保持每次去掉的元素报数都是3的倍数。
* 如果使用从0开始的下标开始计算,那么初始化的时候应该使用-1(对应后来的index--),
* 这样就可以模拟元素已经减少一个了(令起始数字为123,初始化为-1,下一个去掉的数字就是3).
* 如果下标为0的被删除,下标为1的还没有被删除,这时候下标为1的数字的下标自动为0。
*/
public class CircleGame {
public static void main(String[] args) {
System.out.println("请输入参加人数以及退出报数数:");
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
System.out.println("第一种方式(集合):");
outCircle1(n,m);
System.out.println("第二种方式(循环):");
outCircle2(n,m);
}
//第一种方式:使用List集合(推荐)
private static void outCircle1(int n, int m) {
int index = -1; //定义下标,模拟已经去掉一个元素,因此从-1开始
List<Integer> list = new ArrayList<Integer>();//创建集合对象
for (int i=1;i<=n;i++){ //添加数据元素
list.add(i);
}
while (list.size() > 1) { //一直循环去除数据,直到只剩下一个元素
index = (index+m) % list.size();//得到应该出局的下标
list.remove(index--); //去除元素
}
System.out.println("最后留下的是:"+list.get(0));
}
//第二种方式:循环判断
private static void outCircle2(int n, int m) {
//定义标识的某人是否还在圈内
boolean[] isIn = new boolean[n];
for (int i=0; i<isIn.length; i++) {
isIn[i] = true;
}
//定义还在圈内的人数,报数,索引
int inCount = n;
int countNum = 0;
int index = 0;
while (inCount > 1) {
if(isIn[index]) {
countNum++;
if(0 == countNum % m) {
inCount--;
countNum = 0;
isIn[index] = false;
}
}
index++;
if(index == n) {
index = 0;
}
}
for (int i=0; i<isIn.length; i++) {
if(isIn[i]) {
System.out.println("最后留下的是:"+(i+1));
}
}
}
}