C++编写程序实现出圈(约瑟夫问题)

题目描述:

设有n个人围坐一圈并按顺时针方向从1到n编号,从第1个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所剩下一人为止。

输入格式:

输入多行,每行2个数,分别表示n和m.

输出格式:

计算每一行中最后剩下这个人的编号.

样例输入:10 3

样例输出: 4

源代码

#include <iostream>
using namespace std;

int josephus(int n, int m) {
    int last = 0; // 最后剩下的人的编号
    for (int i = 2; i <= n; i++) {
        last = (last + m) % i;
    }
    return last + 1; // 编号从1开始,所以要加1
}

int main() {
    int n, m;
    while (cin >> n >> m) {
        int result = josephus(n, m);
        cout << result << endl;
    }
    return 0;
}

在这个问题中,我们使用了约瑟夫环(Josephus problem)的解法。josephus函数计算最后剩下的人的编号,使用循环从2到n依次计算每一轮的最后一个人的编号。最后将结果输出即可。

在主函数中,我们使用循环读取输入的n和m,并调用josephus函数计算结果,然后输出结果。

注意:题目中的样例输出为4,但是根据约瑟夫环问题的性质,最后剩下的人的编号应该从1开始。因此,在代码中最后输出的结果需要加1。

© 版权声明
THE END
喜欢就支持一下吧
点赞8赞赏 分享