約瑟夫環問題 陣列和list方法

2021-08-06 00:15:12 字數 1342 閱讀 1875

先介紹一下什麼是約瑟夫環問題:就是n個人圍成一圈,從開頭(下標為0)報數,報到你設定的number就要出局,幾輪下來後剩下最後乙個人輸出這個人的序號!

ok,第一種我們用陣列來寫。

int main()

int n = total;

int shout = 1;

int i = 0;

while (total != 1)

else

if (i == 10)

if (shout == number && arr[i] != -1)

}for (int i = 0; i < n; i++) }

system("pause");

大概解釋一下:**前邊比較好理解,給陣列每個元素賦值,然後開始我們的迴圈,因為不知道要迴圈多少次所以我們用while迴圈,條件是什麼呢?是總人數 >1,嗯。然後開始報數,我用了shout這個變數來記錄當前報的數,如果報的數為number並且當前這個位置的人還在,我們就要把當前的值設為-1,代表當前位置的這個人沒了,進行下次遍歷,如果走到了最後乙個,我們就要從頭開始。結束後,我們再遍歷一下陣列,把值沒被設定為-1的那個人輸出。程式結束,附上vs2017下面的結果,還是蠻簡單的對吧?

ok,第二種,我們採用stl標準庫當中list容器來寫。

#pragma warning(disable:4996)

#include #include #include using namespace std;

int main()

list* table = new list();

for (int i = 1; i <= total; ++i)

int shout = 1;

list::iterator it;

for (it = table->begin(); table->size() != 1; )

else

if (it == table->end())

}cout << "the last one is:" << *table->begin() << endl;

system("pause");

大致意思差不多,唯一的好處是list容器的大小是可以變化的,所以我們這邊的判斷條件是table->size() != 1;然後我們設定了乙個迭代器去訪問這個容器,如果發現當前位置的值等於number,我們就用erase()這個方法來刪除這個位置,注意這邊的用法,因為table->erase()返回的是乙個位址。然後我們需要包含標頭檔案。沒啦!

約瑟夫問題 約瑟夫環

約瑟夫 問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死...

約瑟夫問題 約瑟夫環

約瑟夫問題 有時也稱為約瑟夫斯置換,是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。又稱 丟手絹問題 據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也...

陣列 約瑟夫環

題目描述 已知有n個人圍坐在一張圓桌上,編號依次為0,1,2,n 1,編號為n 1與編號為0的人坐在相鄰的位置。現在編號為k的人從1開始報數,數到m的那個人會退出圓桌。他的下乙個人又從1開始報數,數到m的那個人又出列。依此規律重複下去,請問最後出列的人的編號。輸入格式 輸入一行,包含三個整數n,k,...