演算法學習之約瑟夫環問題

2021-07-16 09:56:31 字數 515 閱讀 9870

問題: 

假設下標從0開始,0,1,2 .. m-1共m個人,從1開始報數,報到k則此人從環出退出,問最後剩下的乙個人的編號是多少?

我的理解: 

設f(m,k,i)為m個人的環,報數為k,第i個人出環的編號,m個人的環第i個出來的人就相當於m-1個人的環第i-1個出來的人,不過這個序號是相當於原來m個人的序號。但注意的是m個人的環第乙個出來的人序號要減一。

通俗的講就是:假設10個人的環,報數為3的人出來,那麼10個人的環第乙個出來的人的序號為2,而10個人的環第二次出來的人相當於9個人第一次出來的人。

程式:

//m:人數

//k:報數

//i:第i個出來的

public

static

intfun(int m,int k,int i) else

}

結果: 

經典演算法之約瑟夫環問題

前幾天看到乙個程式設計題,約瑟夫環問題。問題的由來是乙個猶太故事,41乙個人被困,有39個人想要自殺,想活下去的兩個人就出主意說,大家圍成乙個環,報到3的人自殺。結果兩個人成功脫險,也就誕生了這個演算法。由於本人實力有限,寫出的程式也並未進行優化,可能時間複雜度和空間複雜度上有很多問題,只希望給各位...

C 之約瑟夫環

問題原型 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和...

C 之約瑟夫環

0,1,2,3,n 1這n個數排成乙個圈,從數字0開始,每次在圓圈裡面剔除第m個數字。求出這個圓圈最後乙個數字。乙個是使用鍊錶來模擬這個過程 使用公式推導 鍊錶模擬 int lastremaining solution int n,int m else return peoples.begin 公式...