約瑟夫環(vector類解決)

默默無聞的鹹魚發表於2020-12-19

約瑟夫環(vector類解決)

【問題描述】
n 個人(編號從1~n)圍成一圈,從第 k 個人開始數數,數到 m 的人出圈,然後繼續從未出列的下一個人開始數數,數到 m 的人出圈,重複上述過程,直到圈中僅剩下一人。

【輸入形式】
輸入為一行三個正整數,n、k、m。

【輸出形式】
輸出為一個正整數,表示最後剩下的人的編號。,

【樣例輸入】
100 1 5

【樣例輸出】
47

#include <iostream>
#include <vector>
using namespace std;
int main() {
	vector<int> a;
	int n = 0, i = 0, k = 0, m = 0, p = 0;
	cin >> n >> k >> m;
	for (i = 0;i < n;i++) {	//初始化 
		a.push_back(i + 1);
	}
	p = k - 2;				//從第n個人開始數,第零位其實是n前面的那個人。陣列表示法,還要減一
	while (a.size() > 1) {	//迴圈剔除,直到只剩一個 
		for (i = 0;i < m;i++) {
			if (p+1 >= a.size())	{//如果已經到了最後一個數 
				p = 0;
			}
			else {
				p++;
			}
		}
		a.erase(a.begin() + p);
		p--;//重新指向前一個數,再迴圈m次
	}
	cout << a[0];
}

注意:
在此處初始化只能用a.push_back()函式。如果使用vector int a <10000> 再迴圈賦值輸入。a.size()將是10000。
此外,a.size()的儲存型別是short int。無法與-1比較。

相關文章