题目描述
有n只猴子围成一个圈,从1~n编号,大家决定从中选出一个大王。经过协商,决定选大王的规则为:
从编号为1的猴子开始报数,报到kk的猴子出圈,然后再从下一只开始继续报1到k……最后剩下来的那一只就是大王。
要求编程从键盘输入n、k,输出成为大王的猴子编号。
输入
一行两个正整数n和k,2≤n≤1000,2≤k≤
输出
一行一个正整数,代表猴王的编号。
样例输入
3 2
样例输出
3
AC 代码
#include<stdio.h>
#include<stdlib.h>
typedef struct _person
{
int num;
struct _person *next;
} person;
person* init(int n) {
person *h,*p,*tail;
int i;
h=(person*)malloc(sizeof(person));
h->num=1;
h->next=h;
tail=h;
for(i=1;i<n;i++)
{
p=(person*)malloc(sizeof(person));
p->num=i+1;
p->next=tail->next;
tail->next=p;
tail=p;
}
return h;
}
int deal(person *h)
{
person *p,*q;
int n,m;
printf("输入m:\n");
scanf("%d",&m);
for(n=1,p=q=h;p->next!=p;q=p,p=p->next,n++)
if(n%m==0)
{
q->next=p->next;
printf("出列的猴子:\n");
printf("%d\n ",p->num);
free(p);
p=q->next;
n=1;
}
n=p->num;
free(p);
return n;
}
int main()
{
person *h;
int n;
printf("输入n:\n");
scanf("%d",&n);
h=init(n);
printf("猴子大王是: %d\n",deal(h));
return 0;
}