题目描述
N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;……输出依次出圈的人的编号。N,M由键盘输入。
输入格式
一行,包含两个正整数N,M。1<=N,M<=100。
输出格式
先输出一个空行,再依次出圈的人的编号。每个编号后都有一个空格。
输入样例
8 5
输出样例
5 2 8 7 1 4 6 3
代码展示
本题主要利用单向循环链表解决。
#include<iostream>
#include<cstdio>
using namespace std;
struct Node{
int data;
struct Node* next;
};
int main(){
int n,m;
cin>>n>>m;
Node* head=new Node;
Node* p1=head;
head->next=nullptr;
cout<<endl;
for(int i=0;i<n;i++){
Node* p=new Node;
p->data=i+1;
p->next=nullptr;
p1->next=p;
p1=p1->next;
}
p1->next=head->next;//构建首尾相接的循环链表
Node* p2;
Node* temp=nullptr;
p2=head->next;
while(p2->next!=p2){//当只剩下一个元素时退出
for(int i=0;i<m-2;i++) p2=p2->next;
temp=p2->next;
p2->next=p2->next->next;
cout<<temp->data<<' ';
delete temp;
p2=p2->next;
}
cout<<p2->data;
return 0;
}