约瑟夫问题显然可以用更简单的办法解决,但是我决定用链表写一下。
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{
int next;//下一个人是谁
}a[105];
int main(){
cin>>n>>m;
int head=1,tail=n;
a[n].next=1;
//对于第i个同学,如果其j=m
//第i-1个同学的下一位=第i个同学的下一位
//j归零
int pre=1;
for(int i=1;i<n;i++){
a[i].next=i+1;
}
for(int i=1,j=1;i<=n;i=a[i].next,j++){
if(j==m){
cout<<i<<" ";
if(i==head){
a[tail].next=a[head].next;
head=a[head].next;
}
else if(i==tail){
a[pre].next=a[tail].next;
tail=pre;
}
else a[pre].next=a[i].next;
j=0;
}
if(head==tail){
cout<<head;
return 0;
}
pre=i;
}
return 0;
}
感谢阅读。