約瑟夫環問題,即設有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;
}