#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
LinkList createlist_L(int n);
int main()
{
int m,n,k,j;
scanf("%d%d",&m,&n);//m为猴子总数,n为要退出的数字
k=m;
LinkList L1=createlist_L(m);
LNode *p,*q;
p=L1;
while(k>1)
{
j=0;
while(p->next&&j<n-1)
{
p=p->next;
j++;
}
if(!p->next) return 0;
q=p->next;
p->next=q->next;
free(q);
k--;
}
printf("%d",p->data);
}
LinkList createlist_L(int n)
{
//创建循环链表
LinkList L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LNode *r,*p;
r=L;
int i=1;
ElemType e;
while(n--)
{
p=(LNode*)malloc(sizeof(LNode));
p->data=i;
i++;
p->next=r->next;
r->next=p;
r=p;
}
r->next=L->next;
return L;
}
题目:
Description
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
Input
猴子数量n和报数的m
Output
猴王的编号
Sample Input
6 3
Sample Output
1