问题描述
约瑟夫环问题是一个很经典的问题:一个圈共有N个人(N为不确定的数字),第一个人的编号为0或者1(两个都可以,看你的程序如何编写),假设这边我将第一个人的编号设置为1号,那么第二个人的编号就为2号,第三个人的编号就为3号,第N个人的编号就为N号,现在提供一个数字M,第一个人开始从1报数,第二个人报的数就是2,依次类推,报到M这个数字的人出局,紧接着从出局的这个人的下一个人重新开始从1报数,和上面过程类似,报到M的人出局,直到N个人全部出局,请问,这个出局的顺序是什么?
题目分析
用数组来解决问题
题目代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sca = new Scanner(System.in); int n = sca.nextInt(); int m = sca.nextInt(); //用来存值,判断序号位上的人是否出局(0:未出局 1:出局) int[] people = new int[10000]; int i = 0, count = 0, num = 0; while (num < n) {//出局的人数小于总人数 i++;//每个人的序号 if (i > n) { i = 1; } //当people[i]==0时报数 if (people[i] == 0) { count++;//报号 if (count == m) { people[i] = 1;//此人出局 System.out.print(i + " "); num++;//出局的人数加1 count = 0;//每出局一个人都把报号重新赋值为0; } } } } }
有一个我觉得分析约瑟夫问题不错的文章
链接:https://blog.csdn.net/xiaoxi_hahaha/article/details/113036281