有 N只猴子选大王,先从头到尾从1开始报数,报到3的猴子退出,报至尾后,再从头接着报,同样是 1-3 报数,报到 3的猴子退出,…,最后剩下的一只猴子即为大王。输入N,求猴子大王的编号。输入一个整数N (1<=N<=100 )输出最后的猴子大王的编号。c++
时间: 2024-09-15 11:13:18 浏览: 61
这是一个经典的递归问题,可以使用 C++ 通过模拟游戏的过程来解决。这里有一个简单的算法:
1. 首先,创建一个函数 `findMonkeyKing(int n)`,它接受一个整数 n,表示初始的猴子数量。
2. 当 n 只剩一只时,返回 n,因为那只猴子就是大王。
3. 否则,如果 n 能被 3 整除,那么除了最后一个之外,所有猴子都退出了,所以递归调用 `findMonkeyKing(n - 1)`,返回结果就是大王。
4. 如果 n 不能被 3 整除,说明每三个数会留下一个,因此我们递归调用 `findMonkeyKing(n - (n % 3))`,因为在剩余的猴子中,那些没被淘汰的是每隔三个数的。
下面是一个 C++ 程序实现这个思路:
```cpp
#include <iostream>
int findMonkeyKing(int n) {
if (n == 1)
return n;
else
return findMonkeyKing(n - (n % 3));
}
int main() {
int N;
std::cout << "请输入猴子的数量 N (1 <= N <= 100): ";
std::cin >> N;
if (N > 100 || N <= 0) {
std::cerr << "错误的输入范围!" << std::endl;
return 0;
}
int monkeyKing = findMonkeyKing(N);
std::cout << "最后的大王编号是:" << monkeyKing << std::endl;
阅读全文