7. n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。用C语言实现代码
时间: 2025-03-30 12:11:31 浏览: 40
这是一个经典的约瑟夫环问题(Josephus Problem)。以下是基于该问题的C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int num; // 猴子编号
struct Node* next;
} Node;
// 创建循环链表
Node* createCircle(int n) {
Node *head = NULL, *tail = NULL;
for (int i = 1; i <= n; ++i) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) return NULL;
newNode->num = i;
newNode->next = NULL;
if (!head)
head = tail = newNode;
else {
tail->next = newNode;
tail = newNode;
}
}
if(tail != NULL){
tail->next = head; // 构建循环链表
}
return head;
}
void freeList(Node* head) {
Node* cur = head;
do{
Node* temp = cur;
cur = cur->next;
free(temp);
}while(cur != head);
}
int findKingMonkey(int n, int m) {
Node* circle = createCircle(n);
Node* pre = NULL;
Node* current = circle;
while(current->next != current){ // 当前节点不是最后一个节点时继续迭代
for(int count=1 ;count<m ;++count){
pre = current;
current=current->next;
}
printf("猴子%d出局\n",current->num);
pre ->next = current->next;
free(current);
current = pre->next;
}
int result = current->num;
freeList(circle);
return result;
}
int main() {
int n,m;
scanf("%d %d",&n,&m);
if(0 == n || 0 >= m ){
printf("输入无效");
return -1;
}
int kingMonkeyNum=findKingMonkey(n ,m );
printf("\n最后剩下的猴子编号:%d\n",kingMonkeyNum );
return 0;
}
```
这个程序实现了对上述问题的模拟计算过程,并最终确定哪个猴子成为“猴王”。
阅读全文
相关推荐



















