选队长的游戏的一个难点在于:如何让指针在到达数组的最后一个位置时,让指针重新回到数组的开头。而解决这个难点的办法是将指针(index)对数组的长度(size)取模。

    1. package chapter2_5;
    2. import java.util.Scanner;
    3. public class Josephus {
    4. private int total; //总人数
    5. private int report; // 要报的数
    6. private int[] group; // 同学们的小组,队列
    7. private int[] out; //出队次序,用数组显示
    8. public Josephus() {
    9. }
    10. public Josephus(int total, int report) {
    11. this.total = total;
    12. this.report = report;
    13. group = new int[total];
    14. for (int i=0; i < group.length; i++) {
    15. group[i]=i;
    16. }
    17. out = new int[total];
    18. }
    19. public void run() {
    20. int counter = 0;
    21. int i = 0; //同学们的小组的数组下标
    22. int j = 0;//出队次序的数组的下标
    23. int outperson = 0; //记录已出环的人数
    24. while(true) {
    25. if (group[i] != -1) { // group[i]的人值如果是-1,代表出环
    26. //如果没有出环,计数器counter加1
    27. counter = counter + 1;
    28. if (counter % report == 0) { //计数器等于要报的数时(就是能被整除的意思)
    29. outperson = outperson + 1; //出环人数加1
    30. group[i] = -1; // 将出队的人的值标记为-1
    31. out[j] = i + 1; //将出队的人的值添加到出队次序里
    32. j = j + 1; //出队的数组的下标加1,为下一个出队的人准备
    33. }
    34. }
    35. i = (i+1) % total; // 如果i到了数组的最后一位,则将i重置为0.(取模来求得余数来把i重新放回到数组开头)
    36. //假设一共有6个人,i=5就是到了数组的最后一个元素,i+1=6,取模6,等于0,回到开头
    37. if (outperson == total) {
    38. //出环人数等于总人数时,意味着所有人都已出队
    39. break;
    40. }
    41. }
    42. //打印出环顺序
    43. System.out.println("出队次序为: ");
    44. for (int k = 0; k < out.length; k++) {
    45. System.out.print(out[k] + " ");
    46. }
    47. }
    48. public static void main(String[] args) {
    49. /**
    50. * 选队长的游戏,1-3报数,报到3号出列,
    51. */
    52. Scanner input = new Scanner(System.in);
    53. int m = 0;//总的人数
    54. int n = 0;//出队的人要报的数,比如3
    55. while (true) {
    56. System.out.println("请输入总的人数: ");
    57. m = input.nextInt();
    58. System.out.println("请输入要报的数: ");
    59. n = input.nextInt();
    60. if (m!= 0 && n!=0 ) {
    61. Josephus trip = new Josephus (m, n);
    62. trip.run();
    63. break;
    64. }else {
    65. System.out.println("您输入的数据有错误,请重试");
    66. }
    67. }
    68. }
    69. }