猴子选大王c语言简单
时间: 2025-06-25 07:04:49 浏览: 14
### C语言实现猴子选大王的简单算法
以下是基于约瑟夫环问题的一种简洁实现方式,通过数组模拟整个过程来解决猴子选大王的问题。这种方法不需要复杂的指针操作或者链表结构,而是直接利用数组标记哪些猴子已经被淘汰。
#### 算法描述
假设共有 `n` 只猴子围成一圈,从第 1 号猴子开始报数,每次报到 `m` 的猴子被淘汰,直到只剩下一个猴子为止。可以通过一个布尔型数组记录每只猴子的状态(存活或已淘汰),并逐步遍历这个数组完成筛选过程[^1]。
下面是完整的代码示例:
```c
#include <stdio.h>
int findKing(int n, int m) {
int monkeys[n]; // 创建一个大小为n的数组表示猴子状态
for (int i = 0; i < n; i++) {
monkeys[i] = 1; // 初始化所有猴子都活着
}
int count = 0, eliminated = 0;
int index = 0;
while (eliminated < n - 1) { // 当还有超过一只猴子未被消除时继续循环
if (monkeys[index]) { // 如果当前猴子还活着
count++;
if (count == m) { // 数到m则淘汰这只猴子
monkeys[index] = 0; // 将其标记为死亡
count = 0; // 计数器清零
eliminated++; // 已淘汰猴子数量加一
}
}
index = (index + 1) % n; // 循环访问下一只猴子
}
// 找到最后剩下的那只猴子
for (int i = 0; i < n; i++) {
if (monkeys[i]) {
return i + 1; // 返回幸存者的编号
}
}
return -1; // 不可能到达这里
}
int main() {
int n, m;
printf("请输入猴子的数量(n)以及步长(m): ");
scanf("%d%d", &n, &m);
int king = findKing(n, m);
printf("最终成为大王的是第 %d 只猴子。\n", king);
return 0;
}
```
#### 关键点解析
1. **初始化**:创建了一个长度为 `n` 的整型数组 `monkeys[]` 来存储每只猴子的状态,初始值设为 `1` 表明它们均处于活动状态。
2. **计数逻辑**:每当遇到活下来的猴子 (`if(monkeys[index])`) ,便增加计数值;当达到指定数目 `m` 后将其移除(`monkeys[index]=0`) 并重置计数器。
3. **索引更新机制**:采用模运算 `(index+1)%n` 实现圆周式的迭代访问,从而简化边界条件处理。
4. **终止条件判断**:一旦有 `n-1` 只猴子被淘汰,则停止计算,并返回唯一剩余者作为胜出的大王[^3]。
这种方案易于理解且便于调试,在教学场景中非常适合用来讲解经典数据结构与算法的应用实例之一——约瑟夫斯问题变体。
阅读全文
相关推荐













