/*
有n个人,编号为1到n,按顺序围城一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,
数到m的人再出列,以此类推,直到所有的人都出列,请依次输出出列人的编号。
输出要求:两个整数n和m,1<=m,n<=100
输出要求:n个整数,按顺序输出每个出列人的编号
*/
//考的是循环单向链表
#include<bits/stdc++.h>
struct node {//定义节点数据结构
int data;
node* next;
};
int main(){
int n,m;
scanf_s("%d %d", &n, &m);
node* head, * p, * now, * prev;
//创建一个头结点
head = new node;
head->data = 1;
head->next = NULL;
now = head;
//创建剩余的结点
for (int i = 2; i <= n; i++) {
p = new node;
p->data = i;
p->next = NULL;
now->next = p;
now = p;
}
now->next = head;
now = head;
prev = head;
//开始进行约瑟夫问题的解决
while ((n--) > 1) {
for (int i = 1; i < m; i++) {//此处不可以等于m,不如就是数到四就出列
prev = now;
now = now->next;
}
printf("%d ", now->data);//对于出列的打印其data
prev->next = now->next;
delete now; //因为采用的是new创建的,故必须用delete进行删除
now = prev->next;
}
printf("%d ", now->data);
delete now;
return 0;
}
luoguP1996 约瑟夫问题
于 2024-07-24 21:53:30 首次发布