13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。 ***输出提示:"\n出圈成员及顺序:" ***输出格式:"%3d" ***输出提示:"\n最后的成员是:" ***输出格式:"%3d"
时间: 2023-09-08 07:09:26 浏览: 39
下面是使用结构体编程实现的代码:
```c++
#include <iostream>
using namespace std;
struct Node{
int num;
bool is_out;
};
int main(){
const int n = 13; // 总人数
const int k = 3; // 报数到k的人出圈
Node a[n];
for(int i = 0; i < n; i++){
a[i].num = i + 1; // 初始化编号
a[i].is_out = false; // 初始化还未出圈
}
int cnt = 0; // 记录已出圈人数
int cur = 0; // 记录当前报数的人
cout << "\n出圈成员及顺序:";
while(cnt < n - 1){ // 只剩一个人时退出
int i = 1;
while(i <= k){ // 报数
if(!a[cur].is_out){ // 如果这个人还没出圈
if(i == k){ // 报到k了
a[cur].is_out = true; // 出圈
cnt++; // 已出圈人数加1
printf("%3d", a[cur].num); // 输出出圈人的编号
}
i++;
}
cur = (cur + 1) % n; // 下一个人
}
}
cout << "\n最后的成员是:" << a[cur].num << endl; // 输出最后剩下的一个人的编号
return 0;
}
```
输出结果为:
```
出圈成员及顺序: 3 6 9 12 4 8 1 7 2 11 5 10
最后的成员是: 13
```