约瑟夫问题

 

Time Limit: 1 Sec  Memory Limit: 128 MB

 

Submit: 19  Solved: 15
原题链接

 

Description

有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--;
    }

}

 

posted @ 2017-03-17 15:42  dearvee  阅读(212)  评论(0编辑  收藏  举报