/* 邵发, 1309班, */
/*
作业07, 练习2
n只猴子围成一圈,顺时针方向从1到n编号。之后从1号开始顺时针方向让猴子从1到m依次报数,
凡报到m的出圈,取消资格。下一位再从1开始依次报数,
报出m者出圈,最后剩下的就是猴王。问这个猴王原序排在第几位。
*/
#include <stdio.h>
#include <stdlib.h>
// 成员结点
typedef struct __Node
{
int id;
struct __Node* next;
}Node;
int Play(int n, int m)
{
// 链表长度:n
// 构造循环链表
Node* lst = (Node*)malloc(sizeof(Node)*n);
int i;
for(i=0; i<n; i++)
{
lst[i].id = i+1;
if(i+1 == n)
lst[i].next = &lst[0];
else
lst[i].next = &lst[i+1];
}
// 开始玩
Node* cur = &lst[0]; // 当前
Node* prev = &lst[n-1]; // 上一个
int count = 0;
while(prev != cur) // 只剩一个
{
count ++;
if(count == m) // 数到m个
{
count = 0;
// 移除当前结点
prev->next = cur->next;
cur = cur->next;
}
else
{
// 下一位
prev = cur;
cur = cur->next;
}
}
// 剩下的是胜者
int winner = cur->id;
free(lst); // 释放内存
return winner;
}
int ex07_02()
{
int winner = Play(5, 2);
printf("winner is %d . \n", winner);
return 0;
}