报数问题
一、题目内容
题目描述:
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入格式:
初始人数n
输出格式:
最后一人的初始编号
样例输入:
2
样例输出:
3
二、思路分析
围成一个圈在电脑中没有这个概念,但是在可以用数组来模拟转圈,每一次转到最后,回到最开头接着之前的数据进行判断即可。
因此,在输入有多少人的时候,我们记录总人数number,等在逻辑中number数值等于1的时候,就只剩下最后一个人了,完成游戏的目的。在判断的时候,我们人为规定,数组里面的值为1,则是被淘汰。等于0,则是还存在。使用index来记录报数到了第几次,使用求余(%3)的方法来限制报数在1-3之间,取余等于3的时候,退出。每次完成判断,index都要向后增加,表示下一个人报数的变化。最后可以用for找到数组中数值等于1的下标输出即可,或者像注释res一样,每次都记录数值等于1的下标,完成判断后输出即可。
注意:
- int[]数组默认值填充0
三、代码实现
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int number = n; // 记录还剩下多少人
int[] arr = new int[n+3];
int index = 1; // 记录当前报数的位置
// int res = 0; // 方法二,每次记录位置
while (number != 1) { // 停止条件
for (int i = 1; i <= n; i++) {
if (arr[i] != 1) { // 如果该人还在圆桌上,方便筛掉已经退出的人
if (index % 3 == 0) { // 退出的条件
arr[i] = 1;
number--;
}
index++; // 报数往后继续
}
// if(arr[i] == 0){
// res = i;
// }
}
}
// System.out.println(res);
// 方法一:遍历寻找等于0的下标即可
for (int i = 1; i <= n; i++) {
if (arr[i] == 0) {
System.out.println(i);
break;
}
}
}
不足之处,请留言指教