Java初步试探“约瑟夫环”问题
N人围一圈并按顺时针方向从1到N编号,从第S个人开始进行1-M报数,报数到第M人,此人出圈,再从他下一个人重新开始从1-M报数,如此进行下去,每次报数到M的人就出圈,直到所有人都出圈为止。给出这N个人的出圈顺序。
若将N设为13,S设为3,M设为5
package com;
import java.util.*;
public class sentence {
public static void main(String[] args) {
final int N = 13, S = 3, M = 5;//设有13个人,从第3个人开始1-5报数
int i = S - 1, j, k = N, g = 1;
int[] a = new int[N];
for (int h = 1; h <= N; h++)
a[h - 1] = h;//将第h人的编号存入下标为h-的数组元素中
System.out.println("\n出圈顺序为:");
do {
i = i + (M -1);//计算出圈人的下标
while (i >= k)//当数组下标i大于等于圈中的人数k时
i -= k;//将数组的下标i减去圈中的人数k
System.out.print(" " + a[i]);//输出出圈人的编号
for (j = i; j < k - 1; j++)
a[j] = a[j + 1];//a[i]出圈后,将后续人的编号前移
k--;//圈中的人数k-1
g++;//g为循环控制变量
} while (g <= N);//共有N人,循环N次
}
}