约瑟夫问题:n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 11 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
#include<iostream>
using namespace std;
struct node{
int val;
node *next;
};
int main()
{
int n,m=0;
//接收输入n和m
cin>>n>>m;
//初始化链表头
node *head,*p,*now,*prev;
head=new node;
head->val=1;
head->next=nullptr;
now=head;
for(int i=2;i<=n;i++)
{
p=new node;
p->val=i;
p->next=NULL;
now->next=p;
now=p;
}
//首尾相连
now->next=head;
prev=now;
now=head;
int cnt=0;//计数
while(cnt<n)
{
//依次报数
for(int i=1;i<m;i++)
{
prev=prev->next;
now=now->next;
}
//删除对应节点
prev->next=now->next;
cout<<now->val<<" ";
delete now;
now=prev->next;
cnt++;
}
}