約瑟夫環問題

2021-10-09 10:15:27 字數 1607 閱讀 5787

有n個人,圍成乙個環。從編號為1的人開始報數,每題去掉報k的人,不斷重複這個操作。

n個人的編號為1~n,如果他們的編號按順時針排成乙個圓圈,從編號1的人開始順時針報數。(報數是從1報起)當報道k的時候,這個人就退出遊戲圈。下乙個人重新從1開始報數。

最後,要求剩下的人的編號,這就是著名的約瑟夫環問題。

本題目就是已知n,k的情況下,求最後剩下的人的編號。

題目的輸入是一行,2個空格分開的整數n,k

要求輸出乙個整數,表示最後剩下的人的編號。

約定:0 例如輸入:

10 3

程式應該輸出:

4資源約定

峰值記憶體消耗,(含虛擬機器)< 256m

cpu消耗, < 1000ms

這一題,就是n個人按順時針佔成一圈.從第乙個位置開始數,數到k就將對應的位置上的人踢出局。不斷地重複次操作,直到最後剩下最後乙個人,然後輸出這個人地序號。

;//f[n}如果有n個人,從0開始報,最後剩的是誰

//有n個人,最後出局的人的編號

//f[n] = (f[n - 1] + k) % n;

intmain()

一、出隊順序

description

有m個人,其編號分別為1-m。這m個人按順序排成乙個圈。現在給定乙個數n,從第乙個人開始依次報數,數到n的人出列,然後又從下乙個人開始又從1開始依次報數,數到n的人又出列...如此迴圈,直到最後乙個人出列為止。

input

輸入只有一行,包括2個整數m(8 <= m <= 15 ),n( 5 <= n <= 32767 )。之間用乙個空格分開。

output

輸出m個數,用空格隔開

#include

using

namespace std;

const

int n =

200;

int n, k;

bool vis[n]

;int

main()

printf

("%d "

, t)

;//t為當前報數正好到k的人的編號

vis[t]

=true

;//標記這個人已經被踢出去了

tot --

;//沒報以次數,就會踢掉乙個人

}return0;

}

輸出結果:5 2 8 7 1 4 6 3通過queue佇列來實現**

#include #include using namespace std;

int n, k;

queueq;

int main()

}return 0;

}

約瑟夫問題 約瑟夫環

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

約瑟夫問題 約瑟夫環

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

約瑟夫環問題

約瑟夫環問題 問題描述 編號是1,2,n的n個人按照順時針方向圍坐一圈,每個人持有乙個密碼 正整數 一開始任選乙個正整數作為報數上限值m,從第乙個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向的下乙個人開始重新從1報數,如此下去,直到所有人...