1096: 约瑟夫问题
Time Limit: 1 Sec Memory Limit: 128 MBDescription
有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然后又从下一个人开始又从1开始依次报数,数到N的人又出列...如此循环,直到最后一个人出列为止。
Input
输入只有一行,包括2个整数M(8 <= M <= 15 ),N( 5 <= N <= 32767 )。之间用一个空格分开。
Output
输出M行,每行一个整数。
Sample Input
8 5
Sample Output
5
2
8
7
1
4
6
3
HINT
Source
#include<iostream>
using namespace std;
main()
{
int a[2000],M,N,x=1;
cin>>M>>N;
for(int i=1;i<=M;i++) //数组赋初值,初值即为其编号
{
a[i]=i;
}
while(M)
{
a[0]=a[M];
cout<<a[(N%M+x-1)%M]<<endl;
if((N%M+x-1)%M==0)
{x=M;}
else
{x=(N%M+x-1)%M;}
for(int j=x;j<M;j++)
{a[j]=a[j+1];}
M--;
}
}