用c语言完成一个约瑟夫的程序
时间: 2023-02-24 21:02:15 浏览: 53
好的,以下是一个使用 C 语言实现约瑟夫问题的程序:
```
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, m, i, j;
printf("请输入总人数:");
scanf("%d", &n);
printf("请输入报数的大小:");
scanf("%d", &m);
int a[n];
for (i = 0; i < n; i++) {
a[i] = i + 1;
}
i = -1;
j = 0;
while (n > 0) {
i++;
if (i == n) {
i = 0;
}
if (a[i] == 0) {
continue;
}
j++;
if (j == m) {
printf("%d ", a[i]);
a[i] = 0;
j = 0;
n--;
}
}
return 0;
}
```
希望对您有所帮助!
相关问题
c语言完成约瑟夫环问题的处理
好的,以下是使用C语言完成约瑟夫环问题的处理的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义一个双向循环链表的结构体
typedef struct node {
int data; // 节点数据
struct node *prev; // 前驱节点指针
struct node *next; // 后继节点指针
} Node;
// 创建一个双向循环链表
Node *createList(int n) {
Node *head = (Node*)malloc(sizeof(Node)); // 创建链表头节点
head->prev = head->next = head; // 将头节点的前驱和后继节点指向自身
for (int i = n; i > 0; i--) {
Node *node = (Node*)malloc(sizeof(Node)); // 创建新节点
node->data = i; // 新节点数据为 i
node->prev = head; // 新节点的前驱节点为头节点
node->next = head->next; // 新节点的后继节点为头节点的后继节点
head->next->prev = node; // 头节点的后继节点的前驱节点为新节点
head->next = node; // 头节点的后继节点为新节点
}
return head; // 返回链表头节点
}
// 删除节点并返回下一个节点指针
Node *deleteNode(Node *node) {
node->prev->next = node->next; // 将该节点的前驱节点的后继节点指向该节点的后继节点
node->next->prev = node->prev; // 将该节点的后继节点的前驱节点指向该节点的前驱节点
Node *next = node->next; // 保存该节点的下一个节点指针
free(node); // 释放该节点的内存
return next; // 返回下一个节点指针
}
// 处理约瑟夫环问题
void josephus(int n, int m) {
Node *head = createList(n); // 创建链表
Node *node = head->next; // 从头节点的后继节点开始
while (head->next != head) { // 当链表中只有一个节点时结束循环
for (int i = 1; i < m; i++) { // 找到要删除的节点
node = node->next;
}
printf("%d ", node->data); // 输出要删除的节点的数据
node = deleteNode(node); // 删除节点并返回下一个节点指针
}
printf("%d\n", head->next->data); // 输出最后一个节点的数据
free(head); // 释放链表头节点的内存
}
int main() {
int n, m;
printf("请输入总人数和要删除的第几个人:");
scanf("%d%d", &n, &m);
josephus(n, m);
return 0;
}
```
该程序中,我们先定义了一个双向循环链表的结构体 `Node`,其中包含节点数据 `data` 和前驱、后继节点指针 `prev` 和 `next`。然后定义了函数 `createList`,该函数用于创建一个包含 n 个节点的双向循环链表,并返回链表头节点的指针。接着定义了函数 `deleteNode`,该函数用于删除一个节点,并返回下一个节点的指针。最后定义了函数 `josephus`,该函数用于处理约瑟夫环问题,具体实现如下:
1. 首先调用 `createList` 函数创建一个包含 n 个节点的双向循环链表。
2. 从链表头节点的后继节点开始遍历链表,直到链表中只有一个节点。
3. 每次遍历 m 个节点,找到要删除的节点,并输出其数据。
4. 调用 `deleteNode` 函数删除该节点,并返回下一个节点的指针。
5. 重复步骤 3 和 4,直到链表中只剩下一个节点。
6. 输出最后一个节点的数据。
7. 释放链表头节点的内存。
最后,在 `main` 函数中读入总人数和要删除的第几个人,并调用 `josephus` 函数处理约瑟夫环问题。
运用c语言的循环链表完成约瑟夫环问题
可以的,以下是一个使用C语言循环链表解决约瑟夫环问题的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
Node *createList(int n) {
Node *head = NULL, *tail = NULL;
for (int i = 1; i <= n; i++) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = i;
newNode->next = NULL;
if (head == NULL) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
tail->next = head; // 将尾节点指向头节点,形成循环链表
return head;
}
void josephus(int n, int m) {
Node *head = createList(n);
Node *p = head, *prev = NULL;
while (p->next != p) {
for (int i = 1; i < m; i++) {
prev = p;
p = p->next;
}
prev->next = p->next;
printf("%d ", p->data);
free(p);
p = prev->next;
}
printf("%d\n", p->data);
free(p);
}
int main() {
int n, m;
printf("请输入总人数n和报数m:");
scanf("%d%d", &n, &m);
josephus(n, m);
return 0;
}
```
该程序首先创建一个包含n个节点的循环链表,然后按照报数m的规则依次删除节点,直到只剩下一个节点为止。最后输出剩下的节点的编号,即为约瑟夫环问题的解。
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![text/x-c](https://img-home.csdnimg.cn/images/20210720083646.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)