题目描述
今天一共n位同学参加了TIEI期末考试,大家计划在期末考试后在教室玩一个游戏,n个同学编号1-n后围成一圈报数,报到7的倍数的同学将被移出队伍,然后下一位同学继续现在的报数。当剩余人数少于7时结束游戏。
请你输出剩余同学的原始编号。
输入
第一行包含一个整数T,表示样例个数。
对于每个样例,包含一个单独的整数n表示同学的编号。
输出
对于每个样例,在一行输出剩余同学的编号,使用空格分隔。
样例输入 复制
2
5
8
样例输出 复制
1 2 3 4 5
1 2 3 4 5 8
提示
1 <= T <= 1000
1 <= n <= 1000
基于new bing加以修改过后的回答:
可以了,输入完数据,结果一起输出的
#include <iostream>
#include <vector>
#include <sstream>
using namespace std;
int main() {
int T; // 测试用例数量
cin >> T;
vector<string> results(T); // 用于存储所有测试用例结果的向量
for (int t = 0; t < T; t++) { // 遍历所有测试用例
int n; // 学生数量
cin >> n;
vector<int> students(n); // 用于存储学生原始位置的向量
for (int i = 0; i < n; i++) students[i] = i + 1; // 初始化学生原始位置
int count = 0; // 计数变量,用于跟踪当前数字
while (students.size() >= 7) { // 循环直到剩余学生少于7人
for (auto it = students.begin(); it != students.end();) { // 遍历学生向量
count++; // 增加计数变量
if (count % 7 == 0) it = students.erase(it); // 如果当前数字是7的倍数,则从向量中删除该学生
else ++it; // 否则,继续下一个学生
}
}
stringstream ss; // 存储此测试用例结果的字符串流
for (int i = 0; i < students.size(); i++) ss << students[i] << " "; // 将剩余学生的原始位置添加到字符串流中
results[t] = ss.str(); // 将此测试用例的结果存储在结果向量中
}
for (const auto& result : results) cout << result << endl; // 输出所有结果
return 0;
}
您好,回答参考了new bing的回复,使用的数组的方式实现了你的这个经典的约瑟夫环问题
#include <iostream>
using namespace std;
void play_game(int n) {
int a [n]; // 存放同学的编号
for (int i = 0; i < n; i++) {
a [i] = i + 1; // 初始化编号为1-n
}
int count = 0; // 记录退出的人数
int k = -1; // 记录当前报数的下标
while (count < n - 7) { // 当退出人数达到n-7时结束游戏
int i = 0; // 记录当前报数
while (i < 7) { // 每次报数到7
k = (k + 1) % n; // 循环处理下标
if (a [k] != -1) { // 如果该同学没有退出
i++; // 报数加一
if (i == 7) { // 如果报数到7
a [k] = -1; // 标记该同学退出
count++; // 退出人数加一
}
}
}
}
// cout << "剩余同学的原始编号为:";
for (int i = 0; i < n; i++) {
if (a [i] != -1) { // 输出没有退出的同学编号
cout << a [i] << " ";
}
}
cout << endl;
}
int main() {
int t; // 测试用例的个数
// cout << "请输入测试用例的个数和每个测试用例的同学人数,以空格分隔:";
cin >> t;
int a [t]; // 存放每个测试用例的同学人数
for (int i = 0; i < t; i++) { // 输入每个测试用例的同学人数
cin >> a [i];
}
for (int i = 0; i < t; i++) { // 对每个测试用例
play_game(a [i]); // 调用函数
}
return 0;
}
运行结果