题目描述
约瑟夫问题是一个著名的趣题。这里我们稍稍修改一下规则。有n个人站成一列。并从头到尾给他们编号,第一个人编号为1。然后从头开始报数,第一轮依次报1,2,1,2...然后报到2的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3...报到2,3的人出局。以此类推直到剩下以后一个人。现在需要求的即是这个人的编号。
给定一个int n,代表游戏的人数。请返回最后一个人的编号
输入样例
5
输出样例
5
#include <iostream>
#include <vector>
using namespace std;
int getResult(int n) {
// write code here
vector<int> line;
int i, j;
for (i = 1; i <= n; i++) {
line.push_back(i);
}
vector<int> temp;
int m = 2;
//当队列里的人数不为1时
while (line.size() != 1) {
for (i = 1; i <= line.size(); i += m) {
temp.push_back(line[i-1]);
}
line.clear();
line.push_back(temp[temp.size()-1]);
temp.pop_back();
for (j = 0; j < temp.size(); j++) {
line.push_back(temp[j]);
}
temp.clear();
m++;
}
return line[0];
}
int main() {
int n = 6;
cout << getResult(n) << endl;
return 0;
}