猴子选大王

2024-04-28 17:26

1. 猴子选大王

有M只猴子围成一圈,每只各一个从1到M中的编号,打算从中选出一个大王;经过协商,决定出选大王的规则:从第一个开始循环报数,数到N的猴子出圈,最后剩下来的就是大王。要求:从键盘输入M、N,编程计算哪一个编号的猴子成为大王 

#i nclude 

int choose(int num,int del)
{
 int i;
 int a[100];
 for(i=0;i<num;i++)
  a[i]=1;     //猴子状态初始化,为1表示可能被选上,为0表明没希望了;

 int sum=0,     //循环记数;
  countOne=num;   //累积记数初始化,大于1表明还有大王候选人;

 while(countOne>1)
 {
  countOne=0;
  for(i=0;i<num;i++)
  {
   sum+=a[i];
   if(sum==del)
    sum=a[i]=0;  //淘汰倒霉猴子;
   countOne+=a[i];
  }
 }

 for(i=0;i<num;i++)
  if(a[i]!=0)
   return i;   //找到幸运猴子编号(从0开始的);
}

void main()
{
 int num,del;
 cout<<"请输入猴子总数和淘汰数:";
 cin>>num>>del;
 cout<<"第"<<choose(num,del)+1<<"个猴子为王!"<<endl;
}

猴子选大王

2. 急!!猴子选大王!!

程序包括2大模块,分别是猴子编号模块、选大王模块。

3. 关于猴子选大王

参考答案	11、黑夜给了我一双黑色的眼睛,可我却用它来翻白眼。    

关于猴子选大王

4. 猴子选大王问题

#include 
#include 

typedef struct monkey
{
 int num;
 struct monkey *next;
} Monkey,*LINK;

/*创建循环链表,容纳M个猴子。返回指向链表头结点的指针*/ 
LINK createList(int M) 
{ LINK p,head1,p2;
   int i;
   head1=p=p2=(LINK)malloc(sizeof(Monkey));
   for(i=1;i<M;i++)
   {
     p=(LINK)malloc(sizeof(Monkey));
     p2->next=p;
     p2=p;
   }
   p2->next=head1;
   p=head1;
   printf("对猴子进行编号!\n");
      for(i=1;i<=M;i++)
   {
     p->num=i;
  printf("%d号猴子:%d\n",p->num,p->num);
  p=p->next;
   }
 return head1;
}

/*形成循环链表*/ 


/*从headP指向的循环链表中选大王,数到N的猴子淘汰,将依次淘汰出来的猴子插入到headPtr2指向的链表中*/
void selectKing(LINK head,int N,int M)/*N>=2*/
{ 
  LINK p,p2,head2=NULL;
    int i; 
 i=0;
 p=head;//p指向第一个结点

 while(1)
 {
  i++;
  printf("%d号猴子报:%d\n",p->num,i);
  if(p->next==p) 
   break;//此为while循环的出口

  if(i==N)//if语句中是删除结点的过程
  {
   i=0;
   printf("%d号猴被淘汰\n",p->num);
   printf("\n");
   p2->next=p->next;//在此删除结点p
   p=p2->next;//p指向它的下一个结点
   continue;
  }
  else
  {
   if(i==N-1) 
    p2=p;//保存将要退出结点的前一个结点(存到p2中)
    p=p->next;
    
  } 
 
 } 
}

int main() 
{ 
  LINK head=NULL;
  int M,N;

printf("输入猴子数量:"); 
scanf("%d",&M); /*猴子个数*/ 
printf("输入选定的一个小于猴子总数的数:"); 
scanf("%d",&N); /*count=3,表示每次数到3的猴子出局*/ 

head=createList(M);/*创建循环链表*/ 

selectKing(head,N,M);/*选大王*/ 
return 0;
}

5. 7、 猴子选大王**

#include
#include


struct listNode{
 int data;
 struct listNode *nextPtr; 
};

typedef struct listNode LISTNODE;
typedef LISTNODE * LISTNODEPTR;/*LISTNODEPTR:指向LISTNODE指针*/


void printList(LISTNODEPTR currentPtr);/*打印链表*/
void destroyList(LISTNODEPTR headPtr);/*释放链表各个结点*/

LISTNODEPTR createList(int n); 
void selectKing(LISTNODEPTR headPtr1,int n);

int main(int argc, char *argv[])
{
  LISTNODEPTR headPtr1=NULL,headPtr2=NULL;
  int count,monkeys;
  int n; 
  
  printf("input the amount of monkeys:");
  scanf("%d",&monkeys); /*猴子个数*/ 
  printf("input the count number:");
  scanf("%d",&count);  /*count=3,表示每次数到3的猴子出局*/
  
  headPtr1=createList(monkeys);/*创建循环链表*/
  
  selectKing(headPtr1,count);/*选大王。headPtr1指向循环链表。headPtr2指向由淘汰猴子组成地链表*/ 
  
  system("PAUSE"); 
  return 0;
}

/*创建循环链表,容纳n个猴子。返回指向链表头结点的指针*/
LISTNODEPTR createList(int n)
{
   LISTNODEPTR headPtr=NULL,tailPtr,currentPtr;
   int i;
   
   for(i=1;i<=n;i++){
      currentPtr=(LISTNODEPTR)malloc(sizeof(LISTNODE));
      if(currentPtr==NULL)
     printf("memory malloc wrong\n");
  else{ 
       currentPtr->data=i;
       currentPtr->nextPtr=NULL;
       
       if(headPtr==NULL){/*若是作为头结点*/ 
    headPtr=currentPtr;
    tailPtr=currentPtr;
       } 
       else{/*将结点追加到链表末尾*/
        tailPtr->nextPtr=currentPtr;
        tailPtr=currentPtr;
     } 
      }   
   }   
   
   tailPtr->nextPtr=headPtr;/*形成循环链表*/
   
   return headPtr; 
} 

/*从headPtr1指向的循环链表中选大王,数到n的猴子淘汰,将依次淘汰出来的猴子插入到headPtr2指向的链表中*/
void selectKing(LISTNODEPTR headPtr1,int n)/*n>=2*/
{
  LISTNODEPTR prePtr1=NULL,currentPtr1,headPtr2=NULL,tailPtr2;   
 int count;
 
 count=0;
 /*使currentPtr1指向循环链表的最后一个结点*/
 currentPtr1=headPtr1;
 while(currentPtr1->nextPtr!=headPtr1)
    currentPtr1=currentPtr1->nextPtr;
 
 while(currentPtr1!=currentPtr1->nextPtr){
   /*往后数一个猴子*/  
   prePtr1=currentPtr1; 
   currentPtr1=currentPtr1->nextPtr;
   count++;
   
   /*若数到n,则淘汰currentPtr指向的猴子*/
   if(count%n==0){
      /*从headPtr1指向链表中拆下currentPtr指向的结点*/
      prePtr1->nextPtr=currentPtr1->nextPtr;
      currentPtr1->nextPtr=NULL; 
         
      /*将currentPtr1指向的结点插入到headPtr2指向链表中*/ 
      if(headPtr2==NULL){/*若headPtr2指向的为空链表*/          
         headPtr2=currentPtr1;
         tailPtr2=currentPtr1;
      } 
      else{ /*将拆下来的结点组装到headPtr2指向的链表上*/
       tailPtr2->nextPtr=currentPtr1;
     tailPtr2=tailPtr2->nextPtr;
      } 
      
      /*currentPtr1指向上一个结点,为下一次数数做准备*/ 
      currentPtr1=prePtr1; 
      }   
 }     
  
 printf("大王是:%d\n",currentPtr1->data);
    printf("淘汰的猴子是:");
 printList(headPtr2); 
 
 /*释放链表*/ 
 destroyList(headPtr2);
 free(currentPtr1);         
}

/*函数功能:遍历链表,打印链表中各结点的值。 
  参数说明:指向结点的指针,接收链表头接点的值*/
void printList(LISTNODEPTR currentPtr)
{
 if (currentPtr==NULL)
  printf("the list is empty\n");
 else{
  printf("the list is:\n");
  while(currentPtr!=NULL){
   printf("%d--->",currentPtr->data);
   currentPtr=currentPtr->nextPtr; /*currentPtr指向下一个结点*/
  }
  printf("NULL\n\n");   
 }
}

void destroyList(LISTNODEPTR headPtr)
{
    LISTNODEPTR tempPtr;
    while (headPtr!=NULL){
        tempPtr=headPtr;
        headPtr=headPtr->nextPtr;
        free(tempPtr);
    }
}

7、 猴子选大王**

6. M只猴子选大王

顺便帮你把语句也解释好算了
#include 
#include 
#define n 19
#define m 4

typedef struct monkey
{
 int num;
 struct monkey *next;
} Monkey,*LINK;


void main()
{
 LINK p,head,p2;
 int i;
 head=p=p2=(LINK)malloc(sizeof(Monkey));//三个指针指向同一块内存

 for(i=1;i<n;i++)
 {
  p=(LINK)malloc(sizeof(Monkey));
  p2->next=p;
  p2=p;
 }

 p2->next=head;//把链表的首尾相连
 p=head;//p指向了第一个结点

 printf("对猴子进行编号!\n");
 for(i=1;i<=n;i++)
 {
  p->num=i;//从第一个结点到最后一个结点依次给猴子编号
  printf("%d号猴子:%d\n",p->num,p->num);
  p=p->next;
 }//循环结束,p指向了最后一个结点

 i=0;
 p=head;//再把p指向第一个结点

 while(1)
 {
  i++;
  printf("%d号猴子报:%d\n",p->num,i);
  if(p->next==p) 
   break;//此为while循环的出口

  if(i==m)//if语句中是删除结点的过程
  {
   i=0;
   printf("%d号猴被淘汰\n",p->num);
   printf("\n");
   p2->next=p->next;//在此删除结点p
   p=p2->next;//p指向它的下一个结点
   continue;
  }
  else
  {
   if(i==m-1) 
    p2=p;//保存将要退出结点的前一个结点(存到p2中)
   p=p->next;
  }
 }

 printf("胜出:%d",p->num);//最后剩下的结点就是获胜的结点

} 

这个程序其实就是形成了一个有19个结点的循环链表,当碰到m的时候,用这两句话p2->next=head;p=head删除当前的结点,然后再继续判断。

7. 猴子选大王 c#

这个题解是错误的,它忽略了猴子是按圆圈站的条件
看着个,我刚写的
#include
int main()
{
    int m,n,s=0,i=1,p=0,a[100];
    scanf("%d %d",&m,&n);
    for(i=1;i<=m;i++)
      a[i]=1;
    for(i=1;i<=m+1;i++)
     {
        if(i>m) i=1;
        if(a[i]==1) p=p+1;
        if(p==n)
        {
               a[i]=0;
               s=s+1;
               p=0;
        }
        
        if(s==m-1) break;
        
        
        
     }
     for (i=1;i<=m;i++)
        if(a[i]==1) printf("%d",i);
           return 0;
        
    
}
要加分哦

猴子选大王 c#

8. c++ 猴子选大王

http://bbs.lehu.shu.edu.cn/Article.aspx?aid=25182

作为参考