Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 约瑟夫斯的问题_C++_Josephus - Fatal编程技术网

C++ 约瑟夫斯的问题

C++ 约瑟夫斯的问题,c++,josephus,C++,Josephus,我一直在做作业的另一部分,我们要做的是给出两个变量m和n。m代表开始时的玩家,n代表玩家数量。我在计算m变量的位置时遇到了一个问题,这样程序就可以从正确的播放器开始,并跳过适当数量的空格 所以如果m是2,有6名球员,它将从球员2开始,传给球员3,消灭球员3,传给球员4,传给球员5,消灭他们,依此类推,直到剩下一名球员。这是我希望得到的结果: 相反,用我的代码,我得到 我有了替换int I=1的想法;我描述了约瑟夫的问题,或者提供了一个指向描述/@BenVoigt Oh的链接。我可能应该这么做。抱

我一直在做作业的另一部分,我们要做的是给出两个变量m和n。m代表开始时的玩家,n代表玩家数量。我在计算m变量的位置时遇到了一个问题,这样程序就可以从正确的播放器开始,并跳过适当数量的空格

所以如果m是2,有6名球员,它将从球员2开始,传给球员3,消灭球员3,传给球员4,传给球员5,消灭他们,依此类推,直到剩下一名球员。这是我希望得到的结果:

相反,用我的代码,我得到


我有了替换int I=1的想法;我描述了约瑟夫的问题,或者提供了一个指向描述/@BenVoigt Oh的链接。我可能应该这么做。抱歉。@iKyriaki:在消除之间,您需要m个增量,第一个增量是it=eraseit;。您必须检查它==在每次增量之后结束,而不仅仅是在m之后。@iKyriaki:您有两个选项:在它周围放置另一个循环++;通过适当的环绕检查重复m-1次,或者使主循环只在第m次通过时移除某人。
Enter M and N: 2 6

Person removed: 3
Person removed: 6
Person removed: 4
Person removed: 2
Person removed: 5

*** AND THE WINNER IS 1!! ***
Person removed: 2
Person removed: 4
Person removed: 6 
Expression: list iterator not incrementable
Player removed: 3
Player removed: 5
Player removed: 2
Player removed: 6
*** AND THE WINNER IS 4!! ***
#include <iostream>
#include <list>

using namespace std;

int main() {
    int m, n;
    cout << "Enter M and N: ";
    cin >> m;
    cin >> n;
    list<int> players;
    for (int i = 1; i <= n; i++) {
        players.push_back(i); // adding players to the list
    }
    list<int>::iterator it = players.begin();
    while (players.size() > 1) {
        it++;
        if (it == players.end()) { // if the iterator reaches the end of the list
            it = players.begin();  // wrap around to beginning
        }
        cout << "Person removed: " << *it << endl;
        it = players.erase(it);
        if (players.size() == 1) {
            cout << "*** AND THE WINNER IS " << players.front() << "!! ***" << endl;
        }
    }

    system("pause");
    return 0;
}