分析:
100个人循环报数,如果是14的倍数则移除此人,如此往复,到最后只能留下一人。
可以将这100人看做一个集合,如果是14的倍数,则从集合中移除,直到剩下最后一个元素为止。
打印集合,获取集合中唯一的元素。
代码演示如下:
方法一:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
//生成存有100个人的集合
ArrayList<Integer> list = new ArrayList<>();
//集合中的元素为1-100,使用for循环依次添加到集合当中
for (int i = 1; i <= 100; i++) {
list.add(i);
}
//第一个人报数为1
int count = 1;
//获取第一个人的索引
int index = 0;
//循环移除14的倍数,直到集合中剩余1个元素为止
while(list.size() != 1){
//判断报数是否是14的倍数,并且索引要小于集合长度
if(count % 14 == 0 && index < list.size()){
//是则移除
list.remove(index);
//索引向前移动一位,因为删除元素索引不会自动-1
index--;
}
//报数+1
count++;
//索引+1
index++;
//如果索引超过了集合的长度,则归0,表示新的一轮报数
if (index >= list.size()){
index = 0;
}
}
//打印集合中最后剩余的元素
System.out.println(list);
}
}
方法二:
可以通过数学分析找到其中的规律
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
//生成存有100个人的集合
ArrayList<Integer> list = new ArrayList<>();
//集合中的元素为1-100,使用for循环依次添加到集合当中
for (int i = 1; i <= 100; i++) {
list.add(i);
}
//第一个人的索引位置
int index = 0;
//循环报数,直到集合中剩余一个人为止
while(list.size() != 1){
//每相差13个索引报数为14的倍数
//用前一个索引+13再模与集合的长度,余数即为报数为14的倍数所在索引位置
index = (index + 13) % list.size();
//进行删除
list.remove(index);
}
//打印集合中最后剩余的元素
System.out.println(list);
}
}