题目描述:
设有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