用C语言指针写一个程序:有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。输出最后一人的初始编号
时间: 2023-12-23 21:15:27 浏览: 21
n个人围成一圈,从1开始数
好的,以下是用 C 语言指针写一个求解约瑟夫环问题的程序:
```c
#include <stdio.h>
#include <stdlib.h>
struct Node {
int num;
struct Node *next;
};
int main() {
int n;
printf("请输入总人数:");
scanf("%d", &n);
// 创建循环链表
struct Node *head = (struct Node *)malloc(sizeof(struct Node));
struct Node *tail = head;
for (int i = 1; i <= n; i++) {
struct Node *node = (struct Node *)malloc(sizeof(struct Node));
node->num = i;
node->next = head;
tail->next = node;
tail = node;
}
// 从第1个人开始报数,每次报到3的人退出圈子
struct Node *cur = head;
struct Node *prev = tail;
while (cur->next != cur) {
for (int i = 0; i < 2; i++) {
prev = cur;
cur = cur->next;
}
prev->next = cur->next;
free(cur);
cur = prev->next;
}
// 输出最后留下的人的编号
printf("最后留下的是原来的第%d号的那位\n", cur->num);
// 释放内存
free(head);
return 0;
}
```
程序中,我们创建了一个循环链表,然后从第1个人开始报数,每次报到3的人退出圈子,直到只剩下最后一个人。最后输出最后留下的人的编号。
阅读全文