题目
对n个人计算,数到3的倍数离开圈子,直到剩下最后一个人,请问这个人的原始位置?
package com.lession.example;
public class Text04 {
/**
* @param n 圈中总人数
* @return 返回最后一个人的原始位置
*/
public static int joseph (int n) {
boolean[] b = new boolean[n]; // 初始化指定的布尔数组(元素的值标记的人是否在圈中)
for (int i = 0; i < b.length; i++) { // 初始化数组中所有的值都为true(表示所有人都在圈中)
b[i] = true;
}
int len = n; // 声明临时变量表示当前圈中的剩余总人数
int count = 0; // 声明计数器,统计当前的报数情况
int index = 0; // 初始数组的索引
while (len >1) { // 只要圈中的总人数超过一个人就需要报数
if (b[index]) { // 先判断当前位置的人是否在圈中
count++; // 计数要递增
if (count == 3) {
b[index] = false; // 标记当前位置的人已经出圈
count = 0; // 计数器归零
len--; // 总人数减少一个
}
}
index++;
if (index == b.length){ // 判断是否已经数完一圈
index = 0; // 若已经数完一圈,则索引还原,重新计数
}
}
for (int i = 0; i < b.length; i++) {
if (b[i]) { // 如果找到索引位置为true的元素, 则该位置的人就是剩下的人
return i;
}
}
return -1;
}
public static void main(String[] args) {
System.out.print("剩下的最后一个人的原始位置:" + joseph(500));
}
}