約瑟夫環遞迴求解

2021-07-06 07:58:22 字數 649 閱讀 5904

約瑟夫環是乙個數學的應用問題:已知m個人(以編號1,2,3...m分別表示)圍坐在一張圓桌周圍。從編號1開始報數,每次報到k的那個人出列,然後下乙個人再從1開始報數。求解:最後乙個出列的人的編號。
使用遞迴

假設有10個人,編號為1、2、3、4、5、6、7、8、9、10,k=3。從1開始報數,則第一次出列的人的編號為3。從下乙個人又從1開始報數。則第乙個人出列之後的序列為:

4 5 6 7 8 9 10 1 2 (*)

對應的順序序列為:1 2 3 4 5 6 7 8 9 (**)

可以發現:[(*)+k]%m = (),也就是說,m個人圍成的環第i次出來的人的編號是m-1個人第i-1次出來的人的編號+k,然後模m。

設第i次出列的人的編號為f(m,k,i),則:

當i=1時,f(m,k,i)=(m+k)%m

當i!=1時,f(m,k,i) = [f(m-1,k,i-1)+k]%m

private

static

intjoseph(int m, int k, int i)

static

void main(string args)

console.read();

}

約瑟夫環求解O n

有n個人,編號從0到n 1,圍成圈,從0開始報數,第m個人出列,然後繼續從第m 1個人不斷報數 出列,求最後剩下的人是哪個。鍊錶模擬,時間複雜度為o nm 比較簡單,就不贅述了。考慮n個人0,1,2,3,n 1,從0開始報數到m,所以編號為m 1的人出列。剩下m,m 1,m 2,n 2,n 1,0,...

約瑟夫環問題求解

約瑟夫問題如下 n個人圍成圈,依次編號為1,2,n,現在從1號開始依次報數,當報到m時,報m的人退出,下乙個人重新從1報起,迴圈下去,問最後剩下那個人的編號是多少?input amount 佇列人數 m 數到m時退出乙個人 output 最後乙個退出的人的下標 思路 用布林陣列做 我們可以把這amo...

約瑟夫環問題求解

josephu 問題為 設編號為 1,2,n 的 n 個人圍坐一圈,約定編號為 k 1 k n 的人從 1 開始報數,數到 m 的那個人出列,它的下一位又從 1 開始報數,數到 m 的那個人又出列,依次類推,直到所有人出列為止,由此 產生乙個出隊編號的序列。提示 用乙個不帶頭結點的迴圈鍊錶來處理 j...