标题:猴子问题
只看楼主
pen_xian
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-10-7
 问题点数:0 回复次数:8 
猴子问题
大家好!
这几天我在忙着编一个问题,我用了一种方法编出来!
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激



                           [bo] 题目[/bo]
 [bo]山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。[/bo]
[bo]第一种方法:利用循环链表[/bo]
#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;
    }



}

[bo]第二种方法:数组[/bo]
#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);


 }
[bo]
第三种是普通方法for循环
[/bo]
#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();

}


HOUZI1.rar (8.88 KB)
搜索更多相关主题的帖子: 猴子 大王 顺序 附件 办法 
2008-04-17 17:23
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
怎么两种重要的数学方法没介绍??

" border="0" />
2008-04-17 19:19
zaroty
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2008-3-28
得分:0 
原创作品,继续加油哦。

http://hi.baidu.com/zaroty  偶滴博客
2008-04-17 20:24
zjl138
Rank: 1
等 级:新手上路
威 望:1
帖 子:788
专家分:0
注 册:2007-11-12
得分:0 
经典题目变型。。呵呵。

i like linux...
2008-04-17 20:34
pen_xian
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-10-7
得分:0 
谢谢大家 !我希望大家有没有更好的方法与我们分享啊!
我更希望的听到的是我的缺点,希望大家能否指出来!
当然谢谢几位元老的建议,我一定会加注释和方法>呵呵>!
这个题一定在以后加注释和方法!

[[it] 本帖最后由 pen_xian 于 2008-4-18 12:18 编辑 [/it]]
2008-04-18 12:06
caihuafenglei
Rank: 1
来 自:山东淄博
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-4-25
得分:0 
回复 1# 的帖子
好!!!!!!!!!!
2008-04-25 21:10
小耗子
Rank: 2
等 级:论坛游民
帖 子:18
专家分:25
注 册:2010-5-12
得分:0 
剩2只猴子的时候怎么选?
2010-05-17 15:49
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
回复 7楼 小耗子
继续数数,直到剩余为1。
2018-05-19 19:53
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
这类型的问题,请参考:
https://bbs.bccn.net/thread-474669-1-1.html
2018-05-19 19:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-209612-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.991608 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved