约瑟夫问题,哪儿错了?

题目描述
有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。现在给定一个数N从第一个人开始依次报数数到N的人出列然后又从下一个人开始又从1开始依次报数数到N的人又出列如此循环,直到最后一个人出列为止。
输入
输入只有一行,包括2个整数M(8 <= M <= 15 ),N( 5 <= N <= 32767 )。之间用一个空格分开。
输出
输出M行,每行一个整数。

#include<bits/stdc++.h>
using namespace std;
bool a[20];
int main(){
    int n,m,t=0;
    cin>>m>>n;
    for(int i=1;i<=m;i++){
        if(!a[i])t++;
    if(i==n){
    cout<<i<<endl;
    a[i]=1;
    t=0;}
    if(t==m)i=0;
    }
    return 0;
}

【以下回答由 GPT 生成】

改进之后的代码如下:

#include <iostream>
#include <vector>
using namespace std;

int main(){
    int m, n;
    cin >> m >> n;

    // 创建一个vector来表示所有人的编号
    vector<int> people;
    for(int i = 1; i <= m; i++){
        people.push_back(i);
    }

    // 循环报数并出列
    int index = 0; // 当前指向的人的索引
    while(people.size() > 0){
        index = (index + n - 1) % people.size(); // 计算报数到N的人的索引
        cout << people[index] << endl;
        people.erase(people.begin() + index); // 将该人从vector中删除
    }

    return 0;
}

改进之处:

  1. 引入了vector数据结构来表示所有人的编号,方便删除和操作。
  2. 使用循环进行报数和出列,而不是使用单个循环来进行报数。
  3. 使用取模运算来计算报数到N的位置,避免了超出范围的情况。
  4. 删除了原代码中无用的bool数组和循环控制变量,代码更加简洁和清晰。


【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

别的不说,人数减少后m也要减少,你这里没有体现出来,