编写一个函数 king,实现猴子选大王的功能。 新猴王的选择方法是:让 N 只候选猴子围成一圈(最多100只猴子),从某位置起顺序编号为 1 ~ N 号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。
时间: 2024-02-21 21:01:24 浏览: 86
这是一个经典的约瑟夫问题,可以使用循环链表来解决。
首先,我们创建一个Monkey类,用于表示猴子。它有两个成员变量:编号和下一个猴子的指针。
```cpp
class Monkey {
public:
int number;
Monkey* next;
};
```
然后,我们编写一个函数king,用于实现选猴王的功能。它接受一个整数n,表示猴子的数量,返回最后一只猴子的编号。
```cpp
int king(int n) {
// 创建n只猴子,并构成一个循环链表
Monkey* head = new Monkey();
head->number = 1;
Monkey* prev = head;
for (int i = 2; i <= n; i++) {
Monkey* monkey = new Monkey();
monkey->number = i;
prev->next = monkey;
prev = monkey;
}
prev->next = head;
// 开始选猴王
Monkey* current = head;
while (current->next != current) {
// 报数1、2
Monkey* prev = current;
for (int i = 1; i <= 2; i++) {
prev = current;
current = current->next;
}
// 报数3,将当前猴子从链表中删除
prev->next = current->next;
Monkey* temp = current;
current = current->next;
delete temp;
}
int kingNumber = current->number;
delete current;
return kingNumber;
}
```
在函数king中,我们首先创建n只猴子,并构成一个循环链表。然后,从第一个猴子开始报数,每轮报数1、2、3,将报到3的猴子从链表中删除,直到只剩下一只猴子为止,它就是猴王。
最后,我们删除最后一只猴子,并返回它的编号。
下面是一个完整的程序,包括了king函数和测试代码:
```cpp
#include <iostream>
using namespace std;
class Monkey {
public:
int number;
Monkey* next;
};
int king(int n) {
// 创建n只猴子,并构成一个循环链表
Monkey* head = new Monkey();
head->number = 1;
Monkey* prev = head;
for (int i = 2; i <= n; i++) {
Monkey* monkey = new Monkey();
monkey->number = i;
prev->next = monkey;
prev = monkey;
}
prev->next = head;
// 开始选猴王
Monkey* current = head;
while (current->next != current) {
// 报数1、2
Monkey* prev = current;
for (int i = 1; i <= 2; i++) {
prev = current;
current = current->next;
}
// 报数3,将当前猴子从链表中删除
prev->next = current->next;
Monkey* temp = current;
current = current->next;
delete temp;
}
int kingNumber = current->number;
delete current;
return kingNumber;
}
int main() {
int n;
cout << "请输入猴子的数量:";
cin >> n;
int kingNumber = king(n);
cout << "猴王的编号是:" << kingNumber << endl;
return 0;
}
```
阅读全文