描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:
0 0
输出
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
样例输入
6 2 12 4 8 3 0 0
样例输出
5 1 7
这题原本我想用两个cnt来记录剩余的猴子和猴子报的号数、一个fg[]数组来记录这个号数的猴子是否被淘汰 再加一个i来记录报数猴子的数组下标
感觉下标绕来绕去 晕死了 就想到了直接用vector同态数组来存 但又有一个问题出现了 就是你的猴子的号码无法记住 于是我就一开始直接就是把号码存进去 这样就会好很多 然后在通过动态数组的背景 进行猴子淘汰就很方便了 最后数组只剩一个猴子时 他就是king 泰裤辣!
#include<bits/stdc++.h>
using namespace std;
const int N = 305;
int n, m;
int main() {
while (1) {
cin >> n >> m;
if (n == 0) break;
vector<int> v;
for (int i = 1; i <= n; ++i) {
v.emplace_back(i);
}
int fg = 0, i = 0;
while (1) {
if (v.size() == 1) break;
i++;
if (i == m) {
i = 0;
//cout << *(v.begin() + fg) << endl;
v.erase(v.begin() + fg);
fg--;
}
fg++;
if (fg >= v.size()) fg = 0;
}
cout << v.front() << endl;
}
return 0;
}