问题:一共n个人,查到m的人出圈,求最后圈里的人是几号。
public class YusefuTest {
/**
* 返回最后一个出列的人数
*
* @param n
* @param m
* @return
*/
private static int YSF1(int n, int m) {
int r = 0;
for (int i = 2; i <= n; i++) {
r = (r + m) % i;
}
return r + 1;
}
/**
* 返回出列顺序数组
*
* @param n
* @param m
* @return
*/
private static int[] YSF2(int n, int m) {
boolean[] c = new boolean[n];
int k = 0;
int result[] = new int[c.length];
for (int i = 0; i < c.length; i++) {
c[i] = true;
}
int leftCount = c.length;
int index = 0;
int counter = 1;
while (leftCount > 0) {
if (c[index] == true) {
if (counter == m) {
c[index] = false;
leftCount--;
counter = 0;
result[k] = index + 1;
k++;
}
counter++;
}
index++;
if (index == c.length)
index = 0;
}
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
int n = 120;
int m = 3;
System.out.println(YSF1(n, m));
int[] result = YSF2(n, m);
for (int i = 0; i < result.length; i++) {
System.out.print(result[i] + " ");
}
}
}
注解:
public class TestCircle {
public static void main(String[] args) {
int num = 10;
int m = 3;
boolean[] arr =new boolean[num];
for (int i = 0; i < arr.length; i++) {
arr[i] = true; // 为数组赋上boolean型的初值
}
int leftCount = arr.length;
int countNum = 1; // 这是一个报数器
int index = 0; // 作用类似一个指针,这里指队列人员的编号0-9
while (leftCount > 1) // 如果最后剩下的人数不为1,则循环至只剩一人为止
{
if (arr[index] == true)// 如果arr[index]为true则表示此人尚在队列中或暂时未被3整除
{
if (countNum == m)// 某人报的数为3
{
countNum = 0;// 有人出列后,下个人重新开始从1报数,如此反复,此步是将报数器初始化
arr[index] = false;// arr[index]为false表示此人已经出列了
leftCount--;// 剩下的人员总数则减少一个
}
countNum++; // 从1开始重新报数,或下一个人继续报下一个数
}
index++;// 下一个人准备开始报数
if (index == arr.length)// 每次最后一人报完数后就从编号为0的人开始重新报数
{
index = 0;
}
}
// 退出while时队列中仅剩一人了
for (int i = 0; i < arr.length; i++) {
if (arr[i] == true)// 剩下的那一个人就是值为true的那个人
{
System.out.println(i);
}
}
}
}