猴子選大王(約瑟夫環的使用,第乙個不是報數人)

2021-07-05 18:48:57 字數 735 閱讀 5807

n只猴子要選大王,選舉方法如下:所有猴子按 1,2 ……… n 編號並按照順序圍成一圈,從第 k 個猴子起,由1開始報數,報到m時,該猴子就跳出圈外,下乙隻猴子再次由1開始報數,如此迴圈,直到圈內剩下乙隻猴子時,這只猴子就是大王。 

猴子總數n,起始報數的猴子編號k,出局數字m。(2=

猴子大王的編號。3

3 首先是對題目的分析:

一看就是約瑟夫環問題(具體參考我的另一篇部落格

但是與我們所學習的從第乙個人開始報數的問題又有所不同,那麼要如何解決這個問題呢?

此處最大的錯誤就是直接用報數人的編號賦予s初始值,為什麼不可以呢?因為s是由公式推導出的i-1個迴圈所出佇列的人的編號,與直接報數人的編號毫無關係。(本人由於比較急於求成,在此處花了比較多的時間去糾結。)

那麼如何做呢?其實很簡單,將所有報數的人放在一條直線上看,報數人的編號的變化量其實與最終留下的人的編號的變化量是一樣的。什麼意思呢?打個比方,最初報數的人是1號,最終留下的人的編號是2號,那麼將最初報數的人的編號改為3號時,最終留下的人的編號即為3-1+2=4號。

如此來說便很簡單了,只需要考慮到k+s(此處s是第乙個人報數,得到的最終結果)是否會超出n便可以了,於是在原來的結果後面添上s=(k-1+s)%n。(由於計算的時候是當做從0開始報數的,所以k需要減1)

源**:

#include using namespace std;

int main()

s=(s+k-1)%n;

cout<

猴子選大王 約瑟夫環另外的實現方式

猴子選大王程式原理 用陣列儲存猴子的編號,以0表示猴子沒有被選擇 程式可能還很有問題,大家找到問題一定告訴我啊。include int main printf 淘汰的次序 n 主程式部分 程式執行的次數是可以有彈性控制的,最後列印的數字一定是大王的位置 for i 1 i n i if monkey...

7 28 猴子選大王 數學的約瑟夫環問題思考

一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?輸入格式 輸入在一行中給乙個正整...

使用beautifulsoup寫的第乙個小爬蟲程式

昨天才剛學的這個爬蟲的第三方庫,被它的強大所震撼,以下為自己寫的爬蟲的程式 coding utf 8 import urllib2 from bs4 import beautifulsoup import re url response urllib2.urlopen url soup beauti...