中国教程网论坛's Archiver

糖果宝贝 发表于 2006-7-29 09:52

经典问题猴子选王

[b]有50个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

  提示:将50个人的编号保存在数组中,利用循环判断谁要出局,将出局的人所在的数组元素变为-1。当数组中只有一个人时循环结束


代码:
#include <stdio.h>
#include <string.h>
void main()
{
int n[50];
int i;
int s=50;//记录当前的猴子总数
int m=0;//记录要报的数字
for(i=0;i<50;i++)
{
  n=i+1;
}
do
{
  for(i=0;i<50;i++)//50只猴子都有可能被淘汰
  {
   if(n!=-1)//如果猴子还没有被淘汰,编号没有改为-1
   {
    m++;
    if(m==3)//如果报数是3
    {
     s--;//有一只猴子被淘汰
     m=0;
     n=-1;//将淘汰的猴子编号改为1
    }
   }
   
  }
}while(s>1);
for(i=0;i<50;i++)
{
  if(n!=-1)
  {
   printf("编号为%d的人胜出\n",i+1);
  }
}
}[/b]

wo19sl 发表于 2007-5-25 21:19

不知道你写的对不对....反正你很强

kubaidu 发表于 2007-6-6 22:12

for(i=0;i<50;i++)
{
  n=i+1;
}

这是干什么 ?估计应该是存编号吧,那应该是这样吧n[i]=i+1;要不,这样根本不可能通过编译,修改后的程序如下:
#include <stdio.h>
#include <string.h>
void main()
{
int n[50];
int i;
int s=50;//记录当前的猴子总数
int m=0;//记录要报的数字
for(i=0;i<50;i++)
{
  n[i]=i+1;
}
do
{
  for(i=0;i<50;i++)//50只猴子都有可能被淘汰
  {
   if(n[i]!=-1)//如果猴子还没有被淘汰,编号没有改为-1
   {
    m++;
    if(m==3)//如果报数是3
    {
     s--;//有一只猴子被淘汰
     m=0;
     n[i]=-1;//将淘汰的猴子编号改为1
    }
   }
   
  }
}while(s>1);
for(i=0;i<50;i++)
{
  if(n[i]!=-1)
  {
   printf("编号为%d的人胜出\n",i+1);
  }
}
}

结果如下:

编号为11的人胜出
Press any key to continue

[[i] 本帖最后由 kubaidu 于 2007-6-6 22:17 编辑 [/i]]

hbtsth 发表于 2007-9-6 19:52

还在学习中学习中

自由的天空 发表于 2007-10-8 11:13

先复制下,有时间来研究下。

xutingtao 发表于 2008-3-16 20:19

我的算法及代码

“循环左移法”

[[i] 本帖最后由 xutingtao 于 2008-3-17 15:08 编辑 [/i]]

xutingtao 发表于 2008-3-16 20:57

经典问题------猴子选王

“循环左移法”

[[i] 本帖最后由 xutingtao 于 2008-3-17 15:09 编辑 [/i]]

xutingtao 发表于 2008-3-17 15:07

经典问题------猴子选王

经典问题------猴子选王
**********************************************************
***********              “循环左移法”     ***************
**********************************************************
初始条件:数组A[M]的元素依次为1,2,3,...,M-1,M
步骤(1) 原始数组循环左移N位,得到新数组,继续下步  
步骤(2) 将新数组末位截掉,得到新数组,继续下步
步骤(3) 以此为原始数组,继续下步
步骤(4) 重复步骤(1),直到数组只剩一个元素
预期结果:A[0]为王,A[1]倒数第一出局,...,A[M-1]最先出局
代码:
for(int i=M;i>1;i--)
for(int j=0;j<N/i;j++)
for(int k=0;k<i-1;k++)
{int temp;
  temp=a[k];
a[k]=a[k+1];
a[k+1]=temp;

[[i] 本帖最后由 xutingtao 于 2008-3-19 21:48 编辑 [/i]]

梦里人 发表于 2008-5-2 22:51

再顶一次

dkgll 发表于 2008-5-3 10:31

不错啊,学习啦

wanghouyu 发表于 2008-5-17 18:42

高手。
我觉得C学起来很困难,大家有没有好的学习方法

wanghouyu 发表于 2008-5-17 18:43

我先在这些过大家了

qazmnqaz1452 发表于 2008-6-18 00:58

n=i+1?数组存数好像不是这样的吧!!

xonteer 发表于 2008-7-26 20:59

呵呵,不知我要学多久才能写出这个

htx206 发表于 2008-8-27 09:04

这程序好象不对!

孤星一号 发表于 2008-9-1 14:16

n=-1;//将淘汰的猴子编号改为1
   楼主好想你这句话有问题...应改为 将淘汰的猴子的编号改为-1
不然的话

for(i=0;i<50;i++)
{
  if(n!=-1) //不然这里输出的就是最后一个被淘汰的猴子了啊 儿不是胜出者
  {
   printf("编号为%d的人胜出\n",i+1);
  }
}
}

wh1106 发表于 2008-9-20 17:21

呵呵  不太会

lg761025 发表于 2008-10-28 17:09

路过

路过

mengofama 发表于 2008-11-1 10:07

拷回去研究下

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.