約瑟夫問題

2021-06-10 08:43:11 字數 1247 閱讀 9471

問題描述:

m個人圍成一圈報數,數到n(1倍數

或包含n

這個數字

報數規則:

2、報數的最大值為2000,如果報數超過2000,則下乙個人重新從1開始報數

l 要求實現函式

int outfunc (unsigned int itotalnum, unsigned int ikey)

【輸入】

itotalnum:

開始報數前的總人數, 0

ikey:      題目中要求的數目n

【輸出】無

【返回】剩下的人的原來的位置

示例:輸入:itotalnum =5,  ikey =3

返回:4

輸入:itotalnum =15,  ikey =3

返回:5

這問題來自華為2011校園程式設計賽

這個問題可以使用蠻力法解題,蠻力法這個名字聽起來似乎有些愚蠢但這有時也不失是一種處理問題的方法(總比解決不了問題強)畢竟計算機的運算速度目前已將可達幾百萬次或者更多,有些問題也許對人來說蠻力就等於無解但對機器來說可能還是小case,蠻力法的總體思想就是不多想,試便所有可能老老實實乙個個計算總會有乙個是正確答案。

演算法思想:

對於這個問題我們不妨讓計算機去模擬這個問題的執行(因為對於我們來說可以很容易的讓計算機模擬這個問題的執行)構造乙個vector容器(或陣列)容器下標來模擬第幾個人例如下標為0就對應第乙個人,容器的內容為人頭頂的數字一開始都為零(為1時表示該人出圈),再定義乙個account變數做報數用,當指標劃過乙個人account++,並且判斷account%ikey是否=0,若等於零則該人頭頂上的數字換為1,直到容器中只有乙個人頭頂0為止(當然為實現此項我們還需要乙個outpersonc變數來進行對出圈人數的登記,當總人數-出圈人數=1時,我們就可知道容器中只有乙個「幸運的」人)。

演算法偽碼:

while 總人數-出圈人數!=1

if 第i人沒出圈

if 第i人報的數%ikey=0

該人出圈

出圈人數+1

繼續報數

i=i+1

while true

return 遍歷整個vector容器找出內容不為1的下標然後+1

演算法**c++

int outfunc (unsigned int itotalnum, unsigned int ikey)

} while(true)

point++;

} }else

}

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫問題

這是17世紀的法國數學家加斯帕在 數目的遊戲問題 中講的乙個故事 15個教徒和15 個非教徒在深海上遇險,必須將一半的人投入海中,其餘的人才能倖免於難,於是想了乙個辦法 30個人圍成一圓圈,從第乙個人開始依次報數,每數到第九個人就將他扔入大海,如此迴圈進行直到僅餘15個人為止。問怎樣排法,才能使每次...