一堆猴子都有编号,编号是1,2,3m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n从键盘输入,存储方式采用数组及链表两种方式实现该问题求解。
时间: 2023-09-12 08:05:28 浏览: 52
### 回答1:
数组实现:
#include <stdio.h>
int main(void)
{
int m, n;
printf("请输入m和n:");
scanf("%d %d", &m, &n);
int a[m]; // 定义一个长度为m的数组
for (int i = 0; i < m; i++)
{
a[i] = i + 1; // 给数组赋初值,即每只猴子的编号
}
int count = 0; // 记录已经离开圈的猴子数
int index = 0; // 从第0只猴子开始数
while (count < m - 1) // 当圈中只剩下最后一只猴子时,停止循环
{
int k = 0; // 记录已经数了多少只猴子
while (k < n)
{
if (a[index] != 0) // 如果该猴子还没离开圈
{
k++; // 继续数下一只猴子
}
if (k == n) // 如果数到了第n只猴子
{
printf("%d号猴子离开圈\n", a[index]);
a[index] = 0; // 把该猴子从圈中删除
count++;
}
index++; // 继续数下一只猴子
if (index == m) // 如果已经数到圈的末尾了,则从头开始重新数
{
index = 0;
}
}
}
for (int i = 0; i < m; i++)
{
if (a[i] != 0) // 在数组中找到最后剩下的猴子
{
printf("%d号猴子为大王\n", a[i]);
break;
}
}
return 0;
}
链表实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct node // 定义一个链表节点结构体
{
int data;
struct node *next;
} Node;
int main(void)
{
int m, n;
printf("请输入m和n:");
scanf("%d %d", &m, &n);
Node *head = (Node *)malloc(sizeof(Node)); // 定义链表头结点
head->data = 1;
head->next = head; // 使头结点的指针指向它自己
Node *tail = head;
for (int i = 2; i <= m; i++) // 建立循环链表
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = i;
p->next = tail->next; // 新节点的指针指向头结点
tail->next = p;
tail = p;
}
int count = 0; // 记录已经离开圈的猴子数
Node *p = head;
while (count < m - 1) // 当圈中只剩下最后一只猴子时,停止循环
{
for (int i = 1; i < n; i++) // 找到要离开圈的猴子前一个猴子
{
p = p->next;
}
printf("%d号猴子离开圈\n", p->next->data);
Node *temp = p->next; // 把要离开圈的猴子从链表中删除
p->next = temp->next;
free(temp);
count++;
p = p->next; // 继续从下一只猴子开始数
}
printf("%d号猴子为大王\n", p->data);
return 0;
}
### 回答2:
解决这个问题可以分为两个步骤:建立猴子编号的数据结构和模拟猴子离开圈的过程。
1. 建立猴子编号的数据结构:
- 使用数组方式实现:根据m的大小,创建一个长度为m的数组,存储猴子的编号。例如,对于m=5,创建一个长度为5的数组,内容为[1, 2, 3, 4, 5]。
- 使用链表方式实现:根据m的大小,创建m个节点,每个节点存储猴子的编号。节点之间通过指针连接形成一个循环链表。例如,对于m=5,创建一个循环链表,节点内容为1->2->3->4->5->1。
2. 模拟猴子离开圈的过程:
- 数组方式:使用计数器变量count从1开始,表示数到第count个猴子。遍历数组,每次遇到不为0的元素,计数器加1。当计数器count等于n时,将该猴子从数组中移除(即将元素置为0),计数器重置为1。重复上述过程,直到数组中只剩下一个不为0的元素,该猴子为大王。
- 链表方式:使用指针变量指向链表的头节点,从头节点开始遍历链表,每次遇到不为0的节点,计数器加1。当计数器count等于n时,将该节点从链表中移除,计数器重置为1。重复上述过程,直到链表中只剩下一个节点,该猴子为大王。
需要注意的是,使用链表方式实现时,需要注意节点之间的指针连接情况,以及在删除节点时,保持链表的循环特性。
### 回答3:
数组方式实现:
首先,从键盘输入m和n的值。
创建一个长度为m的数组monkeys,存储猴子的编号。
创建一个变量count,用于记录当前圈中剩余猴子的数量,初始值为m。
创建一个变量index,用于记录每次数到第n个猴子时,该猴子在数组中的下标。
然后,进入循环,判断count是否大于1,如果大于1继续进行循环,否则结束循环。
在循环中,通过遍历数组找到要离开圈的猴子。首先,初始化一个变量step为1,用于计数猴子的数量。
然后,从下标为0的猴子开始遍历数组,如果该猴子未离开圈,则step加1。
当step等于n时,表示数到第n个猴子了,此时将该猴子离开圈,将其编号设为0,并将count减1。
更新index为当前猴子的下标。
最后,循环结束时,遍历数组找到最后剩下的那只猴子,其编号即为大王。
链表方式实现:
首先,从键盘输入m和n的值。
创建一个头结点,并将其存储猴子的编号。
创建一个变量count,用于记录当前圈中剩余猴子的数量,初始值为m。
然后,进入循环,判断count是否大于1,如果大于1继续进行循环,否则结束循环。
在循环中,通过遍历链表找到要离开圈的猴子。首先,初始化一个变量step为1,用于计数猴子的数量。
然后,从头结点开始遍历链表,如果该猴子未离开圈,则step加1。
当step等于n时,表示数到第n个猴子了,此时将该猴子离开圈,将其从链表中删除,并将count减1。
最后,循环结束时,链表中剩下的那个猴子即为大王。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.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)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![py](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)