有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
12 4
1
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct stu)
struct stu
{
int num;
struct stu *next;
};
struct stu *creat(int n)
{
struct stu *head,*p1,*p2;
int i;
head=NULL;
for(i=1;i<=n;i++)
{
p1=(struct stu*)malloc(LEN);
p1->num=i;
if(i==1)
head=p1;
else
p2->next=p1;
p2=p1;
}
p1->next=head;//这句话使得链表成为循环链表
return head;
}
struct stu *del(struct stu *head,int m)
{
struct stu *p1,*p2;
p1=head;
int x=1;
while(p1!=p1->next)//当只有一个节点形成链表环时停止
{
if(x==m)
{
p2->next=p1->next;
x=1;
}
else
{
p2=p1;
x++;
}
p1=p1->next;
}
return p1;
}
int main()
{
int n,m;
struct stu *head;
scanf("%d%d",&n,&m);
head=creat(n);
head=del(head,m);
printf("%d\n",head->num);
return 0;
}