今天在群里看到有人提到一个猴子选大王的问题,题目如下:
 
                            题目
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
 
不知道网上有没有这个题目的答案,我自己写了个程序,可以算出哪个猴子可以当大王!!
 
 
InBlock.gif#include <stdlib.h>
InBlock.gif#include <stdio.h>
InBlock.gif //定义链表
InBlock.gif struct data
InBlock.gif{
InBlock.gif int inter;
InBlock.gif struct data *next;
InBlock.gif};
InBlock.gif
InBlock.gif //生成链表函数
InBlock.gif struct data *create( int num);  
InBlock.gif
InBlock.gif void main()
InBlock.gif{
InBlock.gif int n,m,t;
InBlock.gif struct data *p,*head,*q;
InBlock.gifm=6;   //猴子的数量
InBlock.gift=4;
InBlock.gifm+=1;  //猴子的数量和最前面的表头
InBlock.gifn=0;     //好象下面有了,这里并不需要
InBlock.gifhead=create(m);    //生成链表
InBlock.gifp=head;
InBlock.gif while(m>1)
InBlock.gif{
InBlock.gifn=0;
InBlock.gif
InBlock.gif while(n<t)
InBlock.gif{
InBlock.gifq=p;
InBlock.gifp=p->next;
InBlock.gif if(p->next==NULL&&(n!=t-1))     /*注意(n!=t-1)这个条件*/
InBlock.gif{
InBlock.gifp=head;
InBlock.gif}
InBlock.gifn++;
InBlock.gif}
InBlock.gif if(p==head->next)               //指向第一个
InBlock.gif{
InBlock.gifhead=head->next;
InBlock.gif}
InBlock.gif else if(p->next==NULL)         //指向最后一个
InBlock.gif{
InBlock.gifq->next=NULL;
InBlock.gifp=head;
InBlock.gif}
InBlock.gif else                              //其他,这三个的选择的顺序可不是随便排的
InBlock.gif{
InBlock.gifq->next=p->next;          //前后相连,去掉中间的
InBlock.gifp=q;
InBlock.gif if(p->next==NULL)        
InBlock.gif{
InBlock.gifp=head;
InBlock.gif}
InBlock.gif}
InBlock.gifm--;
InBlock.gif}
InBlock.gif
InBlock.gifprintf( "%i",p->inter);
InBlock.gif}
InBlock.gif
InBlock.gif
InBlock.gif struct data *create( int num)
InBlock.gif{
InBlock.gif int i,l=0;
InBlock.gif struct data *head,*tail,*p;
InBlock.gifhead=tail=NULL;
InBlock.gif for(i=0;i<num;i++)
InBlock.gif{
InBlock.gifp=( struct data*)malloc( sizeof( struct data));
InBlock.gifp->inter=l;                         /*给每只猴子编号,猴子编号从1开始,0保留作为其它用途*/
InBlock.gifl++;
InBlock.gifp->next=NULL;
InBlock.gif if(head==NULL)
InBlock.gif{
InBlock.gifhead=tail=p;
InBlock.gif}
InBlock.gif else
InBlock.gif{
InBlock.giftail->next=p;
InBlock.giftail=tail->next;
InBlock.gif}
InBlock.gif}
InBlock.gif return head;     //返回表头
InBlock.gif}