一堆猴子都有编号,编号是1,2,3m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n从键盘输入,存储方式采用数组及链表两种方式实现该问题求解。
时间: 2023-09-03 17:27:16 浏览: 42
### 回答1:
数组实现:
#include <stdio.h>
int main()
{
int m, n, i, j, sum = 0;
scanf("%d %d", &m, &n);
int monkey[m]; // 定义长度为m的数组
for(i = 0; i < m; i++)
{
monkey[i] = i + 1; // 给数组赋值,下标为i,值为i+1
}
i = 0; // i表示当前位置
while(sum < m - 1) // sum表示已经出圈的猴子数量
{
int count = 0; // 计数器
while(count != n)
{
if(monkey[i] != 0) // 如果该位置有猴子,则计数器+1
{
count++;
}
if(count == n) // 如果计数器等于n,则该猴子出圈
{
printf("%d ", monkey[i]);
monkey[i] = 0; // 将数组中该位置赋值为0,表示该位置没有猴子了
sum++; // 已经出圈的猴子数量加1
}
i++; // 当前位置+1
if(i == m) // 如果当前位置已经超过了数组长度,回到第一个位置
{
i = 0;
}
}
}
for(i = 0; i < m; i++) // 最后剩下的一个猴子为大王
{
if(monkey[i] != 0)
{
printf("\n%d", monkey[i]);
}
}
return 0;
}
链表实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int num;
struct Node *next; // 定义指向下一个节点的指针
}node;
int main()
{
int m, n, i, j, sum = 0;
scanf("%d %d", &m, &n);
node *p1 = (node*)malloc(sizeof(node)); // 分配内存空间
node *p2 = p1;
for(i = 1; i <= m; i++)
{
p2->num = i;
if(i == m) // 判断是否为最后一个节点,是则将最后一个节点指向第一个节点
{
p2->next = p1;
}
else
{
p2->next = (node*)malloc(sizeof(node)); // 分配内存空间
p2 = p2->next;
}
}
i = 0; // i表示当前位置
while(sum < m - 1) // sum表示已经出圈的猴子数量
{
int count = 1; // 计数器
while(count != n)
{
p1 = p1->next; // 指向下一个节点
if(p1->num != 0) // 如果该位置有猴子,则计数器+1
{
count++;
}
}
printf("%d ", p1->num);
p1->num = 0; // 将该位置的猴子赋值为0,表示该位置没有猴子了
sum++; // 已经出圈的猴子数量加1
while(p1->num == 0) // 找到下一个位置
{
p1 = p1->next;
}
}
while(p1->num == 0) // 找到最后一个猴子,也就是大王
{
p1 = p1->next;
}
printf("%d", p1->num);
return 0;
}
### 回答2:
使用数组方式实现该问题求解:
```python
m = int(input("请输入猴子的数量:"))
n = int(input("请输入要计数的数:"))
monkeys = [i for i in range(1, m+1)] # 初始化猴子编号数组
idx = 0 # 当前猴子的下标
while len(monkeys) > 1:
idx = (idx + n - 1) % len(monkeys) # 计算每次要离开的猴子的下标
monkeys.pop(idx) # 离开圈子
idx %= len(monkeys) # 调整下标
print("大王的编号是:", monkeys[0])
```
使用链表方式实现该问题求解:
```python
class Node:
def __init__(self, data):
self.data = data
self.next = None
def find_king(m, n):
head = Node(1)
cur = head
for i in range(2, m+1):
cur.next = Node(i)
cur = cur.next
cur.next = head # 形成循环链表
count = 1
while cur.next != cur:
count += 1
if count == n:
count = 0
cur.next = cur.next.next
else:
cur = cur.next
return cur.data
m = int(input("请输入猴子的数量:"))
n = int(input("请输入要计数的数:"))
king = find_king(m, n)
print("大王的编号是:", king)
```
以上两种方式分别使用数组和链表的数据结构来存储猴子的编号,并按照题目要求进行计数和离开操作,直到圈中只剩下最后一只猴子,最后输出该猴子的编号。
### 回答3:
数组方式实现:
1. 首先,从键盘输入m和n。
2. 创建一个大小为m的数组来表示一个编号为1至m的猴子。
3. 创建一个变量count用于记录已离开圈的猴子个数,初始化为0。
4. 创建一个变量index用于记录当前所数到的猴子在数组中的索引,初始化为0。
5. 循环遍历数组,当count < m - 1时执行以下步骤:
6. 在当前索引处判断该猴子是否已经离开圈,若已离开则跳过。
7. 执行count % n == n - 1判断,若满足则将当前索引处猴子离开圈,并将count加1。
8. 将index加1,表示下一个要数的猴子。
9. 若index超过数组长度,则将index重置为0。
10. 剩下最后一只猴子即为大王,输出其编号。
链表方式实现:
1. 首先,从键盘输入m和n。
2. 创建一个链表,将编号为1至m的猴子依次加入链表中。
3. 创建一个指针cur指向链表的头结点,创建一个变量count用于记录已离开圈的猴子个数,初始化为0。
4. 循环遍历链表,当count < m - 1时执行以下步骤:
5. 将cur向后移动n-1个位置,即指向当前要离开圈的猴子。
6. 创建一个临时指针next指向cur->next,表示下一个要数的猴子。
7. 将cur->next指向next->next,即将当前猴子从链表中删除。
8. 释放next指针。
9. 将cur指针指向下一个要数的猴子。
10. 执行count加1。
11. 剩下最后一只猴子即为大王,输出其编号。