close
題目:http://e-tutor.itsa.org.tw/e-Tutor/mod/programming/view.php?a=1285
約瑟夫問題
問題描述:
假設有 100(0 ~ 99) 個人圍成一圈, M 為報數值,從第一個人開始報數,數到第 M 個人時,此人就離開圈子,然後離開的下一位繼續重新報數至第 M 個人 ,直到剩下一人為止,請問是第幾個人呢 ?
輸入說明:
請輸入報數 M 的數值
輸出說明:
依照所輸入地 M 印出最後存活的人
範例:
Sample Input |
Sample Output |
1 |
99 |
20 |
9 |
11 |
40 |
一開始宣告一個長度100的字元陣列,並且全部設為'0',
再來就要按照使用者的輸入,開始數
設一個c=0,用迴圈走訪陣列,c漸漸+1
如果c==num,就把'0'設為'A',並且把c歸零
所以還要再加個條件,在走訪時
如果陣列的元素!='A',c才+1
再來當數到陣列中第100個時,這時就會跳出迴圈,但是還沒留下最後一個元素
所以必須讓迴圈再回頭,跑到最後一個出現為止
但這樣迴圈會一直不停的循環下去,
所以要再設定一個計數器,計算離開的人數
到這裡還沒完成找出最後一個動作,要宣告一個變數,
在cP==100時,讓這個變數得到i是多少,
就代表是在陣列的第幾個,而這個位置就是最後一個離開的
但是以上的程式碼是錯的,因為如果是第100個位置的人
是最後一個離開的則i==99會先剪掉100所以
i會是-1,但並沒有第-1個位置,所以要把
- if(cP==100)
- {
- last=i;
- break;
- }
這個條件移到
- if(i==99)
- i-=100;
的上方
最後在印出last,就完成了
結果
完整程式碼
- #include <iostream>
- using namespace std;
- int main()
- {
- char arr[100]={'0'};
- int num;
- cin>>num;
- int c=0;
- int cP=0;
- int last=0;
- for(int i=0;i<100;i++)
- {
- if(arr[i]!='A')
- c++;
- if(c==num)
- {
- c=0;
- arr[i]='A';
- cP++;
- }
- if(cP==100)
- {
- last=i;
- break;
- }
- if(i==99)
- i-=100;
- }
- cout<<last<<endl;
- return 0;
- }
若想閱讀相關文章請關注我的粉絲團
小資菜鳥向前衝
文章標籤
全站熱搜
留言列表