SCP-errorOWO 2024-03-30 18:34 采纳率: 0%
浏览 1

不会做求帮!约瑟夫问题改版

不会做求帮忙!需要C++的
有n个人排成一圈,从1到n编号。从第一个人开始依次报数(第一个人报的数是1,下一个人报的数是2(当前这个人报的数字等于前面那个人报的数字加一),报数一共进行 n轮,对于第 i(1≤i≤n)轮,数到i的平方的人出列,下一个人继续从1开始报数。结束的时候所有人都会出列。请依次输出每一轮出列的人的编号。

  • 写回答

2条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    如果你不会解决约瑟夫问题的改版,即要求输出每一轮出列人的编号,我可以提供一个解决方案。以下是用C++编写的代码,可以帮助你解决这个问题。

    #include <iostream>
    #include <list>
    
    using namespace std;
    
    void josephus(int n) {
        list<int> circle;  // 创建一个链表用于表示人围成的圈
    
        // 在链表中添加人的编号
        for (int i = 1; i <= n; i++) {
            circle.push_back(i);
        }
    
        int round = 1;  // 记录当前轮数
    
        // 在还有人参与报数的情况下继续进行
        while (!circle.empty()) {
            int numToRemove = round * round;  // 第round轮要出列的人的编号
    
            // 找到要出列的人并移除
            auto it = circle.begin();
            advance(it, (numToRemove - 1) % circle.size());
            cout << *it << " ";
            circle.erase(it);
    
            round++;  // 轮数加一
        }
    }
    
    int main() {
        int n = 0;
        cout << "请输入人数n:";
        cin >> n;
    
        cout << "按照约瑟夫问题改版的规则,每一轮出列的人的编号依次为:";
        josephus(n);
    
        return 0;
    }
    

    这段代码首先创建了一个循环链表,表示人围成的圈。然后,使用一个while循环,在每一轮中找到要出列的人的编号,并将其从链表中移除。最后,按照出列的先后顺序输出每一轮出列的人的编号。

    通过该代码,你可以输入人数n,然后获得按照约瑟夫问题改版规则,每一轮出列的人的编号。

    希望能够帮到你!如果还有其他问题,可以继续提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月30日

悬赏问题

  • ¥30 靶向捕获探针设计软件包
  • ¥15 react-diff-viewer组件,如何解决数据量过大卡顿问题
  • ¥20 遥感植被物候指数空间分布图制作
  • ¥15 安装了xlrd库但是import不了…
  • ¥20 Github上传代码没有contribution和activity记录
  • ¥20 SNETCracker
  • ¥15 数学建模大赛交通流量控制
  • ¥15 为什么我安装了open3d但是在调用的时候没有报错但是什么都没有发生呢
  • ¥50 paddleocr最下面一行似乎无法识别
  • ¥15 求某类社交网络数据集