用C语言编程这道题 n个人围成一圈,从第一个人开始报数,数到m 的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。 备注:1≤m,n≤100 输入格式: 输入两个整数n,m。
时间: 2024-09-08 14:00:53 浏览: 70
这是一个著名的约瑟夫环问题,可以通过循环链表的方式来模拟这个过程。具体步骤如下:
1. 创建一个循环链表来表示围成一圈的人。
2. 初始化时,每个节点的编号从1到n依次入链表。
3. 设置一个计数器,从1开始报数,当计数器的值等于m时,就将当前节点从链表中删除。
4. 将计数器重置为1,从下一个节点开始重新报数。
5. 重复步骤3和4,直到链表为空,即所有人都出圈。
下面是C语言实现的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int number;
struct Node *next;
} Node;
// 创建一个包含n个节点的循环链表
Node* createCircle(int n) {
Node *head = NULL, *pre = NULL, *temp;
for (int i = 1; i <= n; i++) {
temp = (Node*)malloc(sizeof(Node));
temp->number = i;
if (!head) {
head = temp;
} else {
pre->next = temp;
}
pre = temp;
}
pre->next = head; // 使链表成环
return head;
}
// 解决约瑟夫环问题
void josephusCircle(Node **head, int m) {
Node *cur = *head, *pre;
while (cur->next != cur) { // 当链表中至少有两个节点时
for (int count = 1; count < m; count++) { // 报数到m-1
pre = cur;
cur = cur->next;
}
// 删除第m个节点
pre->next = cur->next;
printf("出圈人的编号:%d\n", cur->number);
free(cur);
cur = pre->next;
}
// 输出最后一个人的编号
printf("出圈人的编号:%d\n", cur->number);
free(cur);
*head = NULL; // 清空头指针
}
int main() {
int n, m;
scanf("%d %d", &n, &m);
Node *head = createCircle(n);
josephusCircle(&head, m);
return 0;
}
```
用户输入两个整数n和m后,程序会输出所有出圈人的编号,直到最后一个人。
阅读全文