2037:【例5.4】约瑟夫问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 10954 通过数: 5588
【题目描述】
NN个人围成一圈,从第一个人开始报数,数到MM的人出圈;再由下一个人开始报数,数到MM的人出圈;…输出依次出圈的人的编号。
【输入】
输入NN和MM。
【输出】
输出一行,依次出圈的人的编号。
【输入样例】
8 5
【输出样例】
5 2 8 7 1 4 6 3
【提示】
【数据范围】
对于所有数据,2≤N,M≤10002≤N,M≤1000。
#include <iostream>
using namespace std;
int main()
{
int m, n, a[1000], i;
cin >> n >> m;
for (i = 0; i < n; i++)
a[i] = i + 1;//每个人的序号
int x = 0, y = 0;//x是被踢人数,y是说的数字
i = 0;
while (x < n)
{
if (a[i] != 0)
y++;
if (y == m)
{
a[i] = 0;//被踢出去后将其序号变为0
y = 0;
x++;
cout << i + 1 << " ";
}
i++;
if (i == n)i = 0;//不能在这写break,要是break,就只能循环一次
}
return 0;
}