約瑟夫環問題,即設有n個人坐成一個圈,從某個人開始報數,數到m的人出列,接著從出列的下一個人開始重新報數,數到m的人再出列,如此循環,直到所有人都出列為止。最後按出列順序輸出。代碼如下:
//從第start人開始計數,以alter為單位循環記數出列,總人數為total public int[] Jose(int total, int start,int alter) { int j, k = 0; //count數組存儲按出列順序的數據,以當結果返回 int[] count = new int[total + 1]; //s數組存儲初始數據 int[] s = new int[total + 1]; //對數組s賦初值,第一個人序號為0,第二人為1,依此下去 for (int i = 0; i < total; i++) { s[i] = i; } //按出列次序依次存於數組count中 for (int i = total; i >= 2; i--) { start = (start + alter - 1) % i; if (start == 0) start = i; count[k] = s[start]; k++; for (j = start + 1; j <= i; j++) s[j - 1] = s[j]; } count[k] = s[1]; //結果返回 return count; }