一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n从键盘输入,存储方式采用数组及链表两种方式实现该问题求解。
时间: 2023-08-31 20:34:31 浏览: 71
所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号
### 回答1:
数组实现:
#include <iostream>
using namespace std;
int main() {
int m, n;
cout << "请输入猴子总数m和数n的值:";
cin >> m >> n;
int monkey[m]; // 定义数组存储猴子编号
for (int i = 0; i < m; i++) {
monkey[i] = i + 1; // 初始化猴子编号
}
int count = 0; // 记录已经离开游戏的猴子数目
int index = 0; // 记录当前报数的猴子在数组中的下标
while (count < m - 1) {
int leave = (index + n - 1) % m; // 确定离开游戏的猴子在数组中的下标
cout << "第" << monkey[leave] << "只猴子离开游戏" << endl;
for (int i = leave; i < m - 1; i++) {
monkey[i] = monkey[i + 1]; // 将后面的猴子往前移一位
}
count++; // 离开游戏的猴子数目加1
index = leave; // 更新当前报数的猴子在数组中的下标
}
cout << "最后胜出的猴子是:" << monkey[0] << endl;
return 0;
}
链表实现:
#include <iostream>
using namespace std;
struct Monkey {
int id; // 猴子编号
Monkey* next; // 下一个猴子的指针
Monkey(int i):id(i), next(NULL) {}; // 构造函数
};
int main() {
int m, n;
cout << "请输入猴子总数m和数n的值:";
cin >> m >> n;
Monkey* head = new Monkey(1); // 创建链表头结点
Monkey* current = head; // 记录当前猴子
for (int i = 2; i <= m; i++) {
current->next = new Monkey(i); // 创建新的猴子结点
current = current->next; // 更新当前猴子
}
current->next = head; // 将最后一个猴子的指针指向头结点,构成循环链表
int count = 0; // 记录已经离开游戏的猴子数目
Monkey* prev = current; // 记录当前猴子的前一个猴子结点
while (count < m - 1) {
for (int i = 1; i <= n; i++) {
prev = current;
current = current->next;
}
cout << "第" << current->id << "只猴子离开游戏" << endl;
prev->next = current->next; // 将离开游戏的猴子结点从链表中移除
Monkey* temp = current; // 记录被移除的猴子结点
current = current->next; // 更新当前猴子
delete temp; // 释放被移除的猴子结点的内存
count++; // 离开游戏的猴子数目加1
}
cout << "最后胜出的猴子是:" << current->id << endl;
return 0;
}
### 回答2:
数组方式:
首先,创建一个长度为m的数组,用于存储猴子的编号。初始化数组的值为1到m。
接下来,设置一个变量count,用于记录已经数到的猴子数量,并且初始值为0。
然后,设置一个循环,当数组中的元素个数大于1时,循环执行以下步骤:
- 每次循环开始时,count自增1;
- 使用count对m取余得到当前要出圈的猴子的下标,将该猴子从数组中移除;
- 如果count能够整除n,表示这个猴子需要出圈,将该猴子的编号输出;
- 如果数组的长度变为1,表示只剩下最后一只猴子,将该猴子的编号输出,并结束循环。
链表方式:
首先,创建一个链表,并依次存储1到m的编号。
接下来,设置一个变量count,用于记录已经数到的猴子数量,并且初始值为0。
然后,设置一个循环,当链表的长度大于1时,循环执行以下步骤:
- 每次循环开始时,count自增1;
- 使用count对m取余得到当前要出圈的猴子的下标,找到该猴子的前一个猴子,并将该猴子从链表中移除;
- 如果count能够整除n,表示这个猴子需要出圈,将该猴子的编号输出;
- 如果链表的长度变为1,表示只剩下最后一只猴子,将该猴子的编号输出,并结束循环。
无论是数组方式还是链表方式,最后输出的编号即为大王的编号。
### 回答3:
数组实现:
1. 首先,从键盘输入猴子的数量m和每次数到第n个的数值n。
2. 创建一个长度为m的数组,用于存储猴子的编号。
3. 初始化数组,将猴子的编号依次按照1-m的顺序存入数组。
4. 设置一个变量count,用于记录当前圈中剩余的猴子数量,初始值为m。
5. 设置一个变量index,用于指示当前计数的猴子在数组中的索引,初始值为0。
6. 使用循环,当count大于1时进行以下操作:
a. 从index开始,每数到第n个猴子,则将该猴子的编号设为0,count减一。
b. 循环结束后,将index右移一位,直到找到下一个编号不为0的猴子。
7. 循环结束后,存活的猴子即为大王,输出其编号。
链表实现:
1. 首先,从键盘输入猴子的数量m和每次数到第n个的数值n。
2. 创建一个链表,用于存储猴子的编号。
3. 初始化链表,将猴子的编号依次按照1-m的顺序插入链表。
4. 设置一个指针current,指向链表头部,即第一个猴子。
5. 使用循环,当链表中的节点数量大于1时进行以下操作:
a. 从current开始,每数到第n个猴子,则将该猴子从链表中删除。
b. 删除后,将current指向下一个猴子。
6. 循环结束后,链表中的节点即为大王,输出其编号。
无论是数组还是链表的实现方式,最终输出的结果都是最后剩下的猴子的编号。
阅读全文