2037:【例5.4】约瑟夫问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 6683 通过数: 3355
【题目描述】
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 n,m,i,j,s;
bool a[1000]={0};
int main()
{
cin>>n>>m;
do
{
i++;//逐个枚举圈中的所有位置
if(i>n)
i=1;//数组模拟环状,最后一个与第一个相连
if(!a[i])
j++;//第i个位置上有人则报数
if(j==m)//当前报的数是m
{
j=0;//计数器清零
cout<<i<<" ";//输出出圈人编号
a[i]=1;//此处人已出圈,设置为空
s++;//出圈人数+1
}
}
while(s!=n);//直到所有人都出圈为止
//cout<<endl<<i;求最后一人
return 0;
}