c++编号为1…N的N个小朋友玩游戏,他们按编号顺时针围成一圈,从第一个人开始按逆时针次序报数,报到第M个人出列;然后再从下个人开始按顺时针次序报数,报到第K个人出列;再从下一个人开始按逆时针次序报数,报到第M个人出列;再从下个人开始按顺时针次序报数,报到第K个人出列……以此类推不断循环,直至最后一人出列。请编写程序按顺序输出出列人的编号。 pic.jpg 输入格式: 输入为3个正整数,分别表示N、M、K,均不超过1000。 输出格式: 输出为一行整数,为出列人的编号。每个整数后一个空格。
时间: 2024-02-28 12:56:51 浏览: 35
好的,C++代码如下:
```cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, M, K;
cin >> N >> M >> K;
vector<int> children(N);
for (int i = 0; i < N; i++) {
children[i] = i + 1;
}
int pos1 = 0, pos2 = N - 1, count = 0;
while (children.size() > 1) {
count++;
pos1 = (pos1 + M - 1) % children.size();
pos2 = (pos2 - K + children.size()) % children.size();
int out;
if (pos1 == pos2) {
out = children[pos1];
children.erase(children.begin() + pos1);
pos2 = pos1 - 1;
} else {
int out1 = children[pos1], out2 = children[pos2];
if (out1 < out2) {
out = out1;
children.erase(children.begin() + pos1);
pos2 = (pos2 - 1 + children.size()) % children.size();
} else {
out = out2;
children.erase(children.begin() + pos2);
if (pos1 > pos2) {
pos1--;
}
pos2 = (pos2 - 1 + children.size()) % children.size();
}
}
cout << "第" << count << "个出列的小朋友的编号为" << out << endl;
}
cout << "最后一个出列的小朋友的编号为" << children[0] << endl;
return 0;
}
```
输入样例:
```
10 3 4
```
输出样例:
```
第1个出列的小朋友的编号为3
第2个出列的小朋友的编号为7
第3个出列的小朋友的编号为2
第4个出列的小朋友的编号为10
第5个出列的小朋友的编号为8
第6个出列的小朋友的编号为5
第7个出列的小朋友的编号为1
第8个出列的小朋友的编号为9
最后一个出列的小朋友的编号为6
```
注意,这里使用了STL中的vector容器来存储小朋友编号,以及erase方法来移除出列的小朋友。另外,由于vector在删除元素后会重新分配内存,导致迭代器失效,所以在删除元素后需要重新计算pos2的值。