今天在群里看到有人提到一个猴子选大王的问题,题目如下:
题目
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
不知道网上有没有这个题目的答案,我自己写了个程序,可以算出哪个猴子可以当大王!!

#include <stdlib.h>

#include <stdio.h>

//定义链表
struct data

{
int inter;
struct data *next;

};


//生成链表函数
struct data *create(
int num);

void main()

{
int n,m,t;
struct data *p,*head,*q;

m=6; //猴子的数量

t=4;

m+=1; //猴子的数量和最前面的表头

n=0; //好象下面有了,这里并不需要

head=create(m); //生成链表

p=head;
while(m>1)

{

n=0;

while(n<t)

{

q=p;

p=p->next;
if(p->next==NULL&&(n!=t-1)) /*注意(n!=t-1)这个条件*/

{

p=head;

}

n++;

}
if(p==head->next) //指向第一个

{

head=head->next;

}
else if(p->next==NULL) //指向最后一个

{

q->next=NULL;

p=head;

}
else //其他,这三个的选择的顺序可不是随便排的

{

q->next=p->next; //前后相连,去掉中间的

p=q;
if(p->next==NULL)

{

p=head;

}

}

m--;

}


printf(
"%i",p->inter);

}


struct data *create(
int num)

{
int i,l=0;
struct data *head,*tail,*p;

head=tail=NULL;
for(i=0;i<num;i++)

{

p=(
struct data*)malloc(
sizeof(
struct data));

p->inter=l; /*给每只猴子编号,猴子编号从1开始,0保留作为其它用途*/

l++;

p->next=NULL;
if(head==NULL)

{

head=tail=p;

}
else 
{

tail->next=p;

tail=tail->next;

}

}
return head; //返回表头

}
转载于:https://blog.51cto.com/240420643/94156