C 經典題目 約瑟夫環問題

2022-08-30 16:54:18 字數 1120 閱讀 2260

有n個人圍成一圈,順序排號。從第乙個人開始報數(1~3報數),凡報到3的人退出圈子,問最後留下的人原來排在第幾號。

首先由使用者輸入人數n,然後對這n個人進行編號【因為如果不編號的話,我們就不能知道最後是哪位童鞋留下來了:)】

然後就開始了一圈一圈的迴圈,不斷形成新的圈子,不斷有人被淘汰,那麼迴圈到什麼時候截止呢?對只剩最後乙個人,也就是說淘汰n-1了個人的時候,這個時候停止迴圈。

在實際情況中,應該是這n個人一開始圍成了乙個大圈子,然後隨著不斷的淘汰,圈子不斷減小,最後剩下的那個人的一開始的編號就是我們要的結果。

我在用陣列來表示這些人,因為進行了初始化,所以陣列中元素的值都是原來的編號,因此我們只需要將被淘汰的人對應的陣列元素的值設定為0即可。然後隨著不斷的迴圈,最後只剩下乙個值不為0的陣列元素,這個元素就是我們要的結果。

#includeusing namespace std;

int main()

i=1;

k=0;

/*因為n個人圍成乙個圈,所以當j>n的時候,j要除n取餘,例如(n+1)%n=1

之所以要++j,而不是j++是因為要先加1再判斷*/

for(j=0;k<9;j=++j%10)

else

}} for(i=0;i<10;i++)

{ if(array[i]!=0)//通過上面的操作,所有淘汰的人員陣列對應的值都為0,不為0的就是留下來的

{ cout<<"留下來的是,第"<

我們可以對上述程式做一些擴充套件,讓使用者輸入總人數和用於淘汰的那個數字。

#includeusing namespace std;

int main()

{ int i; //i用來記錄數的那個數字

int n,m;

int k,j; //k用來記錄淘汰的人數 ,j用來表示第j個人

cout<<"請輸入總人數n和用於淘汰的數字m:";

cin>>n>>m;

int *array=new int[n];

//對n個人進行編號

for(i=0;in的時候,j要除n取餘,例如(n+1)%n=1

之所以要++j,而不是j++是因為要先加1再判斷*/

for(j=0;k11計信班趙哲

經典約瑟夫環問題

1 coding utf 8 2 author diva 3 使用者輸入n,n代表人數,圍成一圈,順序排號 4 從第乙個開始報數,1,2,3,數到3的人,退出圈子 5 6 報數邏輯,數到3的把對應的位置置為0,直到剩下最後乙個人 7 def num report list create 8 n 0 ...

經典問題 約瑟夫環

約瑟夫環就是n個人圍在一起丟手絹。手絹每經過乙個人報乙個數,開始的時候從第乙個人開始報數1,報數依次增加。若報到3的人出局,並且下乙個人重新從1開始報數。直到局內剩下兩個人。這個問題的輸入有兩個。第乙個是n,參與遊戲的人數。第二個是m,最後留下的倖存者人數。輸出有一行,是倖存者的編號。這個問題有兩種...

演算法題目 約瑟夫環問題

題目 0,1,n 1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。解法一 經典解法,用環形鍊錶模擬圓圈。這種方法每刪除乙個數字需要m步運算,總共有n個數字,因此總的時間複雜度是o mn 同時這種思路還需要乙個輔助鍊錶來模擬圓圈,其空間複雜度是o...