1051: 【基础】约瑟夫问题
时间限制: 1.000 Sec 内存限制: 16 MB
提交: 9147 解决: 5351
[命题人:][下载数据: 30]
题目描述
有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然后又从下一个人开始又从1开始依次报数,数到N的人又出列...如此循环,直到最后一个人出列为止。
输入
输入只有一行,包括2个整数M(8 <= M <= 15 ),N( 5 <= N <= 32767 )。之间用一个空格分开。
输出
输出M行,每行一个整数。
样例
输入
8 5
输出
5 2 8 7 1 4 6 3
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int N,M;
cin>>N>>M;
int* a=new int[N];
for(int i=0;i<N;i++){
a[i]=i+1;
}
int countN=0;
int countM=0;
for(int i=0;;i++){
if(a[i%N]!=-1){
countM++;
}
if(countM==M){
cout<<a[i%N]<<endl;
a[i%N]=-1;
countN++;
countM=0;
}
if(countN==N){
break;
}
}
delete a;
return 0;
}