约瑟夫问题的定义:假设n个人排成环形,且有一个正整数 m <= n。从某个指定的开始,沿环报数,每遇到第m个人
就让其出列,且报数进行下去。这个过程一直进行到所有人都出列为止。每个人出列的次序定义了整数0,1,2,...n-1
的(n, m)-约瑟夫排列。例如(7, 3)约瑟夫排列为<2,5,1,6,4,0,3>。
Code
#include<iostream>
using namespace std;
int main()
{
int n, m;
int a[100]; // 保存出列的顺序
int b[100]; // 标记第i个人是否出列,0表示还未出列,1表示已经出列
while (cin >> n >> m)
{
memset (b, 0, 100);
int i = 0;
int pos = -1; // 当前数到的人的编号,编号从0开始的
int count = 0;
while (count < n)
{
while (1)
{
pos = (pos + 1) % n; // 环状处理
if (b[pos] == 0) // 已经出列的人不再参与循环报数
i++;
if (i == m) // 报数到了m了
{
b[pos] = 1;
i = 0;
break;
}
}
a[count++] = pos; // 依次保存出列人编号
}
for (int j = 0; j < n; j++)
cout << a[j] << ' ';
cout << endl;
}
return 0;
}

本文详细解释了如何使用C++编程语言解决约瑟夫问题,并提供了完整的源代码实现。通过模拟环形队列中人的出列顺序,最终得出给定参数下的人们出列的排列顺序。
1235

被折叠的 条评论
为什么被折叠?



