题目描述
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n 个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入 #1
10 3
输出 #1
3 6 9 2 7 1 8 5 10 4
说明/提示
1 ≤ m , n ≤ 100
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node* next;
} LNode, *LinkList;
void Josephus(int n, int m);
int main()
{
int m, k, n;
scanf("%d %d", &n, &m);
Josephus(n, m);
}
void Josephus(int n, int m)
{
LinkList p = NULL, x = NULL, list = NULL;
int i;
for(i = 1; i <= n; i++)
{
p = (LNode*)malloc(sizeof(LNode));//向系统申请内存
if (p == NULL)
{//确保指针使用前为非空指针,当p为空指针时结束程序
printf("分配失败!");
exit(1);
}
p->data = i;//编号
if(list == NULL)
list = p;
else
x->next = p;//将x和p节点串起来
x = p;//x指针后移
}
p->next = list;//建立一个循环链表
p = list;//p指针后移
while(p->next != p)
{
for(i = 1; i < m; i++)
{
x = p;
p = p->next;
} //p指向第m个结点,x指向第m-1个结点
x->next = p->next; //删除第m个结点
printf("%d ", p->data); //输出一个结点编号
free(p); //释放被删除结点的空间
p = x->next; //p指向新的出发点
}
printf("%d", p->data); //输出最后那个结点的编号
free(p);
}