C++报数问题,实在不会了

题目描述
今天一共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加以修改过后的回答:
可以了,输入完数据,结果一起输出的

img

#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;
}

运行结果

img