约瑟夫问题的定义:假设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;
}