假設下標從0開始,0,1,2 .. m-1共m個人,從1開始報數,報到k則此人從環出退出,問最後剩下的乙個人的編號是多少?
現在假設m=10
0 1 2 3 4 5 6 7 8 9 k=3
第乙個人出列後的序列為:0 1 3 4 5 6 7 8 9
即:3 4 5 6 7 8 9 0 1(*)
我們把該式轉化為:
0 1 2 3 4 5 6 7 8 (**)
則你會發現: ((**)+3)%10則轉化為(*)式了
也就是說,我們求出9個人中第9次出環的編號,最後進行上面的轉換就能得到10個人第10次出環的編號了
設f(m,k,i)為m個人的環,報數為k,第i個人出環的編號,則f(10,3,10)是我們要的結果
當i=1時, f(m,k,i) = (m+k-1)%m
當i!=1時, f(m,k,i)= ( f(m-1,k,i-1)+k )%m
所以程式如下:
public class joseph
} public static int joseph(int m,int k,int i)
}
約瑟夫環之遞迴演算法
問題描述 約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍。由第乙個人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到最後剩下乙個人。一般的思路就是通過乙個count計數的方法,迴圈遍歷鍊錶,逐一刪除。但...
約瑟夫環非遞迴演算法分析
joseph問題描述 n個人 編號0 n 1 從0開始報數,報到 m 1 的退出,剩下的人繼續從0開始報數。求勝利者的編號。求解思路 我們知道第乙個人 編號一定是m n 1 出列之後,剩下的n 1個人組成了乙個新的約瑟夫環 以編號為k m n的人開始 k k 1 k 2 n 2,n 1,0,1,2,...
約瑟夫環非遞迴演算法分析
joseph問題描述 n個人 編號0 n 1 從0開始報數,報到 m 1 的退出,剩下的人繼續從0開始報數。求勝利者的編號。求解思路 我們知道第乙個人 編號一定是m n 1 出列之後,剩下的n 1個人組成了乙個新的約瑟夫環 以編號為k m n的人開始 k k 1 k 2 n 2,n 1,0,1,2,...