基本約瑟夫環的一些理解

2021-08-15 23:22:15 字數 800 閱讀 9339

約瑟夫環(josephus  cycle)

編號為1,2,3,……,n的n個人按順時針方向圍坐一圈。任選乙個正整數作為報數上限m,從第乙個人開始按順時針方向自1開始順序報數,報到m時停止報數,報m的人出列。從他在順時針方向上的下乙個人開始重新從1報數,如此下去,直到最後圈中只剩下最後乙個人(勝利者)。請設計程式輸出勝利者。 

首先反應可以用鍊錶的資料結構模擬過程,得出最後結果,這樣時間複雜度為o(m*n),下面介紹對數學方法的理解:

假設n個人編號從零開始(與陣列對應起來),n個人的編號:

0 1 2 3 ……n-2 n-1

第一次出列的人編號(m-1)%n,則從k=m%n開始繼續報數,從k開始排列的的n個人即:

k k+1 k+2 …… n-2 n-1 0 1 2 …… k-2 k-1

對應報數

0 1 2 …… n-2 n-1

找規律加理解可知,(下面對應報數+k)%n=上面原來編號,

這樣我們用迭代的思想,設f(i)表示i個人玩遊戲贏的人的編號,從i=1推到i=n,即求得了最後結果。

f(i)=(f(i-1)+k)%i

即f(i)=(f(i-1)+m%i)%i

即f(i)=(f(i-1)%i+m%i%i)%i

即f(i)=(f(i-1)%i+m%i)%i

即f(i)=(f(i-1)+m)%i    (取模運算分配律)

c++**如下:

#include int main()

printf("%d",s+1);

}

以上理解有問題歡迎指出,不甚感激。

關於約瑟夫環的一些漏洞

include using namespace std typedef struct data typedef struct lnode lnode,linklist intmain intm cout 請輸入設定的上限數 cin m linklist p 驗證是否可以迴圈輸出,即迴圈鍊錶是否建立成...

約瑟夫環問題的理解

據說著名猶太歷史學家josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有...

Kafka一些基本術語 理解

zookeeper 在kafka中的作用 其中 zookeeper 是 kafka 用來負責集群元資料的管理 控制器的選舉等操作的 borker,topic,partition之間的關係 個人理解 乙個topic中可以包含多個borker,乙個topic中劃分為幾個分割槽,乙個分割槽可以有多個副本,...