有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...