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
淘汰人:
只需把數組後面的移上來佔掉位置就行