有n個人圍成一圈,報數從1到m依次迴圈報數,報到m的就退出(死)。
現在我們來看遞推,由於為了方便表示(s+m)%i=0的情況,我們讓第一人的編號為0,(從一開始也可以)。
既然你問遞推,那步驟就不說了,只說這個公式吧
讓獲勝者的編號為0(最後乙個人只有他了當然是0)f(i)表示獲勝者在剩下i個人時的那一局的編號
則f(1)=0
f(i)=[f(i-1)+m]%i.
這裡我們可以這樣理解
如果獲勝者在這一局遊戲中編號為k(從0開始編號),而每一局中會大聲喊出他的編號的人是m個(注意喊得數字從0開始,則喊m-1的人死,但這個人是第m個人),而第m個人又是獲勝者的前面第k+1個人,那麼如果上一輪的遊戲的人數足夠(叫了m次還沒有人重複叫),則獲勝者在上一局的編號是[(m-1)+(k+1)]=m+k(m-1代表死的那個人的編號,而k+1代表死的那個人的後面第n個人的編號),即在上一局中他是第m+k+1個人。
但是,為什麼要%i,因為如果在上一局中,人數不夠m-1個,那麼是不是就會有的人重複報了兩次甚至更多次數!!!!那麼,就可以看成數學上的乙個週期問題,那麼%i,假設為倒數第二句,i=2
那麼,i是不是就起了乙個限定編號的作用呢,即可以得到的編號只有0和1(餘數只有這兩個),那麼,又知道m+k為有足夠人時的時候獲勝者的編號,則(k+m)%i不就是把他的編號變成以0~i-1的週期輪換運動嗎,即設k+m=3;i=2。 把 0 1 2 3 中的不能得到的2 3變成 0 1 則為 0101來表示嗎
那麼是不是就是獲勝者在這一局當中的編號呢!
那麼獲勝者不就是第s+1個人嗎!
#includeusing namespace std;
void joseph(int n,int m)
int main()
{ int m,n;
cin>>n>>m;
cout<
約瑟夫斯問題 關於約瑟夫斯問題的反饋
約瑟夫斯問題 我上週的文章是關於解決kotlin的約瑟夫斯問題的。為了便於比較,這是我最初編寫的版本 class soldier val position int fun isdead state state dead enum class state class circle private va...
約瑟夫斯問題及其程式設計
然後問題是,給定了n和k,一開始要站在什麼地方才能避免被處決?在約瑟夫斯問題裡詳細介紹了其中k 2時此問題的數學方式的解法,並得到了乙個可以通過數學歸納法證明的定理 如果比較令人眼前一亮的是這個結論的表現形式竟與整數n的二進位制表示有關 即把n 的第一位移動到最後,便得到 的二進位制表示為 接著使用...
演算法系列 約瑟夫斯問題
約瑟夫斯問題 有時也稱為約瑟夫斯置換 是乙個出現在電腦科學 和數學中的問題。在計算機程式設計 的演算法中,類似問題又稱為約瑟夫環。有個囚犯站成乙個圓圈 準備處決。首先從乙個人開始,越過 個人 因為第乙個人已經被越過 並殺掉第k個人。接著,再越過 個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最...