题目描述
个人围成一圈,从第一个人开始报数,数到 的人出列,再由下一个人重新从 开始报数,数到 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n-1 名小朋友,而该题是全部出圈。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入 #1
10 3
输出 #1
3 6 9 2 7 1 8 5 10 4
说明/提示
1≤n,m≤100
分析
这题明显可以用动态链表解决
代码
#include <bits/stdc++.h>
using namespace std;
struct node{
int data;//定义链表节点
node * next;
};
//节点的值
//单向链表,只有一个 next 指针
int main(){
int n,m;
scanf("%d %d",&n, &m);
node * head,*p,*now,* prev;//定义变量
head = new node;
head->data = 1;
head->next = NULL;//分配第 1个节点,数据置为1
now = head;//当前指针是头
for(int i=2;i<=n;i++){
p = new node;
p-> data = i;
p->next = NULL;//p是新节点
now-> next = p;//把申请的新节点连到前面的链表上
now = p;//尾指针后移一个
}
now -> next = head; //尾指针指向头: 循环链表建立完成
//以上是建立链表,下面是洛谷 P1996 的逻辑和流程。后面4 种代码的逻辑流程完全一致
while((n--)>1){
for(int i=1;i<m;i++){
prev = now;
now = now -> next;
}
printf("%d", now-> data) ; //输出第m个节点,带空格
prev -> next = now -> next; //跳过这个节点
delete now; //释放节点
now = prev -> next; //新的一轮
}
printf("%d", now-> data); //打印最后一个节点,后面不带空格
delete now; //释放最后一个节点
return 0 ;
}