猴子问题

  • 来源: 编程中国 作者: 若水   2008-04-21/16:44
  • 大家好!
    这几天我在忙着编一个问题,我用了一种方法编出来!
    但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
    注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 


                                题目
    山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
    第一种方法:利用循环链表
    #include<stdio.h>
    #include<malloc.h>
    #define M 8            //共有8只猴子
    #define N 3            //数到3只时退出第三只
    typedef struct monkey
    {int number;
    int flag;
    struct monkey* next;
    }MONKEY;
    main()
    { MONKEY *head=NULL,*p,*s;
      int i,sum=0,count=0;
      clrscr();              //清屏
      p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
      p->number=1;p->flag=1;
      p->next=head;
      head=p;
      for(i=2;i<=M;i++)
        { s=(MONKEY *)malloc(sizeof(MONKEY));
         s->number=i;s->flag=1;
         s->next=head;
         p->next=s;p=p->next;
        }
        p=head;
       for(;;)
        {if(p->flag==1)
           count++;
         if(count==N)
            {p->flag=0;
             count=0;
             sum++;}
         if(sum==M-1)
            break;
         p=p->next;
        }
        p=
        head;
        for(i=1;i<=M;i++)
        { if(p->flag==1)
            printf("\t%d",p->number);
          p=p->next;
        }



    }

    第二种方法:数组
    #include<stdio.h>
    #define M 8
    struct monkey
    {int number;
    int nextp;
    }link[M+1];

    void main()
    {int i,count,h;
    for(i=1;i<=M;i++)
    {  if(i==M)
       link[i].nextp=1;
       else
       link[i].nextp=i+1;
      link[i].number=i;
    }
    printf("\n");
    count=0;
    h=M;
    printf("依次退出的猴子: \n");
    while(count<M-1)
    {i=0;
    while(i!=3)
    { h=link[h].nextp;
       if(link[h].number)
         i++;}

    printf("%4d",link[h].number);
    link[h].number=0;
    count++;
    }

    printf("\n大王是:");
      for(i=1;i<=M;i++)
      if(link[i].number)
        printf("%3d\n",link[i].number);


    }

    第三种是普通方法for循环

    #include<stdio.h>
    void main()
    { int i,k,m,n,num[50],q,*p;
        clrscr();
       printf("input number of person: n=");
        scanf("%d",&n);
    printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
        scanf("%d",&q);
       p=num;
      for(i=0;i<n;i++)
        *(p+i)=i+1;
       i=0;
       k=0;
       m=0;
      while(m<n-1)
       {if(*(p+i)!=0) k++;
         if(k==q)
          { *(p+i)=0;
            k=0;
            m++;
          }
        i++;
        if(i==n)i=0;
       }
      while(*p==0)p++;
        printf("The last one is NO:%d\n",*p);
         getch();


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多