1.顺序存储结构
#include<stdio.h>
#include<stdlib.h>
#define MAX_SIZE 1000
typedef struct {
int data[MAX_SIZE]; // 存储猴子编号
int length; // 当前猴子的数量
} SeqList;
bool InitList(SeqList& L, int m) {
if (m > MAX_SIZE) return false;
L.length = m;
for (int i = 0; i < m; i++) {
L.data[i] = i + 1;
}
return true;
}
void MonkeyKing(SeqList& L, int n) {
int i = 0; // 当前索引
int k = 0; // 计数器
while (L.length > 1) {
k++; // 每次循环计数器加1
if (k == n) { // 当计数器等于步长n时
// 移除编号为L.data[i]的猴子
for (int j = i; j < L.length - 1; j++) {
L.data[j] = L.data[j + 1]; // 将后面的猴子前移
}
L.length--; // 猴子数量减1
k = 0; // 重置计数器
if (i == L.length)
i = 0; // 如果到达数组末尾,重置索引到数组开头
}
else {
i++; // 索引自增
if (i == L.length) i = 0; // 如果到达数组末尾,重置索引到数组开头
}
}
}
int main() {
int m, n; // m是猴子数量,n是步长
scanf_s("%d %d", &m, &n);
SeqList L;
MonkeyKing(L, n);
printf("%d\n", L.data[0]); // 输出最后剩下的猴子的编号
return 0;
}
2.链式存储结构
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
bool InitList(LinkList& L) {
L = (LNode*)malloc(sizeof(LNode));
if (L == NULL)
return false;
L->next = NULL;
return true;
}
void List_TailInsert(LinkList& L, int m) {
L->data = 1;
L->next = NULL;
LinkList p = L;
for (int i = 2; i <= m; i++) {
LinkList q = new LNode;
q->data = i;
q->next = NULL;
p->next = q;
p = q;
}
p->next = L;
L = p;
}
void MonkeyKing(LinkList& L, int n) {
LNode* p = L;
while (p->next != p) {
for (int i = 1; i < n; i++)
p = p->next;
LNode* s = p->next;
p->next = s->next;
free(s);
}
L = p;
}
int main() {
int m, n; // m是猴子数量,n是步长
scanf_s("%d %d", &m, &n);
LinkList L;
InitList(L);
List_TailInsert(L, m);
MonkeyKing(L, n);
printf("%d\n", L->data); // 输出最后剩下的猴子的编号
return 0;
}