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