我們首先來看一下約瑟夫環問題:
給定m個人,m個人圍成一圈,在給定一個數n,從m個人中的第一個人每第n個人便將其除去,求被最后一個出去的人的編號。
思路:
建立一個長度為m+1的數組,將其的內容初始化為0至m
我們設置變量i與j,i代表數組元素的下表,因為我設置的數組長度為m+1,所以數組下標就為每個人的編號,當i==m的時候,我們將i置為0,讓其從頭開始便利。
變量j為判斷當前元素是否為排列的第n個元素,如果是則將當前下標為i的元素的值置為0,不是的話,i++,j++,每當我們遍歷到數值為0的元素時,continue,i++,不進行其他操作。
具體代碼如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); int m=scanner.nextInt(); //讀取m的值 int n = scanner.nextInt(); //讀取n的值 int[] a = new int[m+1]; //設置一個長度為m+1的數組 for(int i=0;i<=m;i++) { //初始化數組,將數組的值與其下標一一對應,易懂方便操作 a[i]=i; } /* * 設置變量i與j * i為判斷下標即為元素值 * j為判斷n的元素,如果==n即將當前i的元素除去 */ int i=0,j=1; boolean flag=false;//設置一個標志變量,在循環中用於break以及continue while(true) { i++; //一輪循環進行一次下表后移 flag=false; //將標志變量設置為false if(a[i]==0) { //如果當前下標中的值為0,即跳過 flag=true; if(i==m) //判斷此時的i是否==m,若果等於m則讓其重置為0 i=0; } if(flag) //對應上面的函數 continue; if(j==n) { //如果j==n了 if(PanDuan(a)) { //判斷此時數組中是否只有一個非零元素,如果是則當前找到的元素為最后一個元素,否則執行else System.out.println(i); flag=true; //因為找到了最后一個元素,則設置標志變量為true } else { //只滿足j==n,不滿足其為最后一個元素,則讓當前元素的內容置為0,且讓j=0,開始新的計數 a[i]=0; j=0; } } if(flag) //找到了最后一個元素,跳出循環 break; if(i==m) //如果i==m,則讓i=0 i=0; j++; //一輪循環,j++ } } static boolean PanDuan(int [] a) { //判斷給定數組中石否只有一個非零元素 int count =0; for(int i=0;i<a.length;i++) { if(a[i]!=0) count++; } if(count==1) return true; return false; } }
此方法為數組解決,比起用集合麻煩,但是適用於還沒有學習集合api的小伙伴們。有更簡單的方法可以跟我交流哦~