已知n我的(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號爲k的人開始報數,數到m的那我的出列;他的下一我的又從1開始報數,數到m的那我的又出列;依此規律重複下去,直至殺掉全部人,當剩下

public class Game {
	public int fun(int N,int k,int m) {    //第k我的
		int[] array=new int[N];            //建立N我的
		int n=N;						   //剩餘人數
		for(int i=0;i<array.length;i++) {  //讓每一個人拿着最初編號
			array[i]=i+1;                  
		}
		for(int i=0;i<N-1;i++) {           //淘汰N-1我的
			if(k==0) {                     
				k=(k+m)%n;	
			}else {
				k=(k+m-1)%n;
			}
			for(int j=k;k!=0&&j<n;j++) {   //一我的被淘汰,後面的補上來
				array[j-1]=array[j];
			}
			n--;
		}
		return array[0];
	}
	public static void main(String[] args) {
		System.out.println("獲勝者編號爲:"+new Game().fun(10,5,3));
	}
}

思路java

有三個變量,因此建立有三個形參的函數;數組

建立N我的,每一個人拿着本身的最初編碼,獲勝了就能獲得最初編碼了;函數

找到將要淘汰的人,把淘汰的人cut掉;編碼

N我的要淘汰N-1我的,因此以上步驟進行N-1次循環;spa

返回獲勝者編碼code

找到將要淘汰的人class

從第k我的開始報數,數到m的人淘汰,下一個淘汰的也就是k+m-1;變量

從淘汰人的下一位開始報數,數到m的人淘汰,下一個淘汰的也就是k+m  //k爲被淘汰的人循環

可是第k我的被淘汰了,本來爲k+1的人就成了第k個,因此下一個淘汰的爲k+m-1;static

淘汰前:A    B    C    D    F               //k=3

              1    2     3    4    5

淘汰後:A    B    D    F                     //D的編號就爲3了,從他開始報數,下我的爲3+m-1

               1    2     3    4

有種特殊狀況:當被淘汰的人爲數組中最後一位是時,他的下一位的位置不會-1,因此下一個淘汰的也就是k+m

淘汰前:A    B    C    D    F               //k=5,k%=n    //n爲人數

              1    2     3    4    5

淘汰後:A    B    C    D                     //從淘汰者的下一位開始報數也就是A,A的編號並沒變,下我的爲k+m

               1    2     3    4

淘汰人

只需把數組後面的移上來佔掉位置就行