题目描述】
有n个人依次围成一圈,从第1个人开始报数,数到第m个人出列,然后从出列的下一个人开始报数,数到第m个人又出列,…,如此反复到所有的人全部出列为止。设n个人的编号分别为1,2,…,n,打印出列的顺序。
【输入】
n和m。
【输出】
出列的顺序。
【输入样例】
4 17
【输出样例】
1 3 4 2
用数组实现链式结构
#include<bits/stdc++.h>
using namespace std;
int s[100];
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<n;i++) s[i]=i+1;//建立链表
s[n]=1;//把最后一个指向第一个
int p=n;
int k=0;
for(int i=0;i<n;i++){//每次循环出一个人,所以循环n次
for(int j=0;j<m-1;j++){//报数,这里就报m-1次,以为s[p]指向的是下一位
p=s[p];
}
printf("%d ",s[p]);
s[p]=s[s[p]];//把报数的那个结点去掉
}
return 0;
}
还可以用循环队列的思想做这题
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
queue<int>Q;
for(int i=1;i<=n;i++) Q.push(i);
int flag=1;
while(!Q.empty()){
if(flag%m==0){
cout<<Q.front()<<" ";
Q.pop();
}
else{
Q.push(Q.front());
Q.pop();
}
flag++;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int s[100];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) s[i]=i;
int head=1,tail=n;
int flag=1;
while(head<=tail){
if(flag==m){
flag=1;
cout<<s[head]<<" ";
head++;
}
else{
flag++;
int p=s[head];
s[++tail]=p;
head++;
}
}
return 0;
}
链表实现 (90分有能看出来错误的望告知)
#include<bits/stdc++.h>
using namespace std;
struct node
{
int d;
node *next;
};
node *head,*p,*r;
int main()
{
int n,m;
cin>>n>>m;
head=new node;
head->d=1;
head->next=NULL;
r=head;
for(int i=2;i<=n;i++){
p=new node;
p->d=i;
p->next=NULL;
r->next=p;
r=p;
}
r->next=head;
r=head;
for(int i=1;i<=n;i++){
for(int j=1;j<=m-2;j++) r=r->next;
cout<<r->next->d<<" ";
r->next=r->next->next;
r=r->next;
}
cout<<endl;
return 0;
}