一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n从键盘输入,存储方式采用数组及链表两种方式实现该问题求解。 用c语言
时间: 2024-01-13 15:03:11 浏览: 68
好的,这是一个经典的约瑟夫问题,可以使用数组或链表来实现。下面是两种方式的代码实现:
1. 使用数组实现:
```c
#include <stdio.h>
int josephus(int m, int n) {
int i, j, k = 0, a[m];
for (i = 0; i < m; i++) {
a[i] = i + 1;
}
for (i = 0; i < m - 1; i++) {
for (j = 1; j < n; j++) {
k++;
if (k >= m) {
k = 0;
}
while (a[k] == 0) {
k++;
if (k >= m) {
k = 0;
}
}
}
a[k] = 0;
while (a[k] == 0) {
k++;
if (k >= m) {
k = 0;
}
}
}
for (i = 0; i < m; i++) {
if (a[i] != 0) {
return a[i];
}
}
}
int main() {
int m, n, result;
printf("请输入 m 和 n 的值:");
scanf("%d %d", &m, &n);
result = josephus(m, n);
printf("最后的大王是第 %d 只猴子\n", result);
return 0;
}
```
2. 使用链表实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node *next;
} Node;
int josephus(int m, int n) {
int i, j, k = 0;
Node *head = (Node *)malloc(sizeof(Node));
head->data = 1;
Node *p = head;
for (i = 2; i <= m; i++) {
Node *q = (Node *)malloc(sizeof(Node));
q->data = i;
p->next = q;
p = q;
}
p->next = head;
for (i = 0; i < m - 1; i++) {
for (j = 1; j < n; j++) {
p = p->next;
}
Node *q = p->next;
p->next = q->next;
k = q->data;
free(q);
}
return k;
}
int main() {
int m, n, result;
printf("请输入 m 和 n 的值:");
scanf("%d %d", &m, &n);
result = josephus(m, n);
printf("最后的大王是第 %d 只猴子\n", result);
return 0;
}
```
阅读全文