C list 解決約瑟夫問題

2021-10-05 16:27:59 字數 1164 閱讀 2524

約瑟夫問題所述:猴子選王

有n只猴子,按順時針方向圍成一圈選大王(編號為1-n),從第一號開始報數,一直數到m,數到m的猴子退出圈外,剩下的猴子再接著從1開始報數,就這樣,直到圈中只剩下乙隻猴子時,這個猴子就是猴王。程式設計輸入n,m後,輸出最後猴王的編號。

輸入樣例: 6 2

12 4

8 30 0

輸出樣例:517

簡述要點:

1.迴圈的條件是只要還有不止乙隻猴子,就讓其出列,直到最後只剩下一 只猴子為止

2.list erase函式的返回值是指向下乙隻猴子的迭代器

3.如果踢出的是最後乙隻猴子,迭代器指向的是最後乙個位置的後乙個位置,也就是為空monkeys.end(),這是要重新定義迭代器 it=monkeys.begin()使其指向最前面也就是第一只猴子

#include

#include

using

namespace std;

intmain()

//跳出迴圈說明到序號為m的那只猴子了

it = monkeys.

erase

(it)

;//踢出它!踢出後 迭代器指向後乙個位置

if(it == monkeys.

end(

)) it = monkeys.

begin()

;//如果踢出後指向後乙個位置是最後的最後 則返回前面

} cout << monkeys.

front()

<< endl;

//front函式返回第乙個元素 也就是最後剩下的那個元素的引用

}return0;

}

這個程式也可以使用vector實現,但是執行速度要慢很多,且list也可以使用push_back(i)函式。因為vector的erase操作牽扯到元素的移動,不能在常數時間內完成,所以花費的時間和容器中的元素個數有關;而list的erase操作只是修改幾個指標而已,可以在常數時間內完成。當n很大(數十萬)時,兩種寫法會有明顯區別。

關於約瑟夫問題,有很多的版本,解法也有很多,在此最後給出乙個大佬關於約瑟夫問題的內容總結寫的很好,值得學習。

php解決約瑟夫問題

約瑟夫環 是乙個數學的應用問題 一群猴子排成一圈,按1,2,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去 如此不停的進行下去,直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求程式設計模擬此過程,輸入m n,輸出最後那個大王的編號。下面列出了...

python解決約瑟夫問題

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

約瑟夫問題(c c 解決)

問題描述 設有n個人圍坐在圓桌周圍,現從某個位置m 1 m n 上的人開始報數,報數到k的人就站出來。下乙個人,即原來的第k 1個位置上的人,又從1開始報數,再報數到k的人站出來。依次重複下去,直到全部的人都站出來為止。試設計乙個程式求出這n個人的出列順序。include using namespa...