约瑟夫环问题我首先想到的就是数组模拟,其实也有想过这是有规律的,可以递归求解,但是忘了😂
1.先来说说数组模拟,思想很简单,就是m个人,报数为n的人出圈,即打个标记,遇到这个标记就跳过,直到最后一个人为止,上代码。
import java.util.*; public class Main { public static void main(String[] args) { int m = 0;//总人数 int n = 0;//报数 Scanner in = new Scanner(System.in); m = in.nextInt(); in.nextLine(); n = in.nextInt(); int[] num = new int[m]; int count = 0;//出圈人数 int pos = 0;//位置 while(n > 0) { for (int i = 0; i < num.length; i++) { if(num[i] == 0) { pos++; if(pos == n) { num[i] = 1; pos = 0; System.out.println("第"+ i +"号出圈"); } } } } } }
上面第一中方法如果m和n的数字小还好,如果很大的话要花费的时间就很长了,所以下面递归求解是比较好的方法
import java.util.*; public class Main { public static void main(String[] args) { int m = 0;//总人数 int n = 0;//报数 Scanner in = new Scanner(System.in); m = in.nextInt(); in.nextLine(); n = in.nextInt(); int pos = 0; /* int[] num = new int[m]; int count = 0;//出圈人数 int pos = 0;//位置 while(n > 0) { for (int i = 0; i < num.length; i++) { if(num[i] == 0) { pos++; if(pos == n) { num[i] = 1; pos = 0; System.out.println("第"+ i +"号出圈"); } } } } */ //这个递推公式只能求最后一个出圈的人 //参考网址https://blog.csdn.net/u011500062/article/details/72855826 //参考公式f(m,n) = (f(m-1,n) + n)%m //m人数 n报数 for(int i=2; i<=m; i++) { pos = (pos+n)%i; } //当有m个人,报数为n出圈,最后一个离场的人的下标 System.out.println(pos); } }