有M个猴子围成一圈,每个有一个编号,编号从1到M。打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一个开始,每隔N个,数到的猴子出圈,最后剩下来的就是大王。
要求:从键盘输入M,N,编程计算哪一个编号的猴子成为大王。
实现如下:
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct monkey)
struct monkey
{
int num;
struct monkey *next;
struct monkey *prior;
};
void selcetKing(int m, int n)
{
//建立带头结点的链表
struct monkey *h, *p, *p1;
p1=(struct monkey *)malloc(LEN);
if(p1==NULL)
printf("No enough memory!");
p1->num=0;
p1->next=NULL;
p1->prior=NULL;
h=p1;
p=p1;
for (int i=0; i<m; i++)
{
p1=(struct monkey *)malloc(LEN);
if(p1==NULL)
printf("No enough memory!");
p1->num=i+1;
p1->next=NULL;
p1->prior=p;
p->next=p1;
p=p1;
}
h->num=m; //头结点的数据域存放猴子的个数
p->next=h->next;
h->next->prior=p;
//遍历链表
// printf("%d",h->num);
// struct monkey *q=h->next;
// for(int j=0; j<h->num; j++)//正向验证
// {
// printf("%d/n",q->num);
// q=q->next;
// }
// for(int r=0; r<h->num; r++) //反向验证
// {
// printf("%d/n",q->num);
// q=q->prior;
// }
struct monkey *q, *r, *s;
q=r=s=h->next;
while (h->num>1)
{
int j;
for (j=1; j<n; j++)
{
q=q->next;
r=r->next;
s=s->next;
}
if (j==n)
{
q=q->prior;
r=r->next;
free(s);
h->num--;
if (h->num==1)
{
r->next=NULL;
r->prior=NULL;
q=r;
s=r;
}
else
{
q->next=r;
r->prior=q;
s=r;
q=r;
}
}
}
printf("%d/n",r->num);
}
void main()
{
int m,n;
printf("请输入猴子数目及所报数目:");
scanf("%d%d", &m, &n);
if(m>0&&n>0)
selcetKing(m,n);
else
printf("请输入正整数!/n");
}