链表实现:
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *next;
};
int main(void)
{
int n, m;
int i;
int answer[100];
int count = 0;
struct node *head, *tail, *p, *q;
head = (struct node *)malloc(sizeof(struct node));
head->next = NULL;
while (1) {
scanf("%d %d", &n, &m);
if (n == 0 || m == 0) {
free(head);
break;
}
else {
//尾插法,生成循环链表
tail = head;
for (i = 0; i < n; i++) {
p = (struct node *)malloc(sizeof(struct node));
p->data = i + 1;
tail->next = p;
p->next = head->next;
tail = p;
}
p = head->next; //后结点
q = tail; //前结点
i = 1;
while (p != q) {
if (i == m) {
q->next = p->next;
free(p);
p = q->next;
i = 1;
} else {
q = p;
p = p->next;
i++;
}
}
answer[count] = p->data;
count++;
free(p);
head->next = NULL;
}
}
for (i = 0; i < count; i++) {
printf("%d\n", answer[i]);
}
return 0;
}
数组实现:
#include <stdio.h>
int main(void)
{
int monkey[300] = {0}; //最多300个猴子
int n, m, i, amount;
int count;
while (1)
{
scanf("%d %d", &n, &m);
if (n == 0 || m == 0)
{
break;
}
count = 0; //小循环,0-m
i = 0; //大循环,0-n,数组元素索引
amount = n; //剩余猴子总数
//数组元素等于0表示没有退出,数组元素等于1表示已经退出竞争猴王
for (i = 0; i < n; i++) {
monkey[i] = 0;
}
i = 0;
while (n > 1)
{
if (monkey[i] == 0)
{
count++;
//符合退出条件的,打上标签1
if (count == m)
{
monkey[i] = 1;
count = 0;
n--;
}
}
i++;
//重新开始大循环
if (i == amount)
{
i = 0;
}
}
//打印猴王
for (i = 0; i < amount; i++)
{
if (monkey[i] == 0)
{
printf("%d\n", i + 1);
break;
}
}
}
return 0;
}