经典问题猴子选王
[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] 不知道你写的对不对....反正你很强 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]] 还在学习中学习中 先复制下,有时间来研究下。
我的算法及代码
“循环左移法”[[i] 本帖最后由 xutingtao 于 2008-3-17 15:08 编辑 [/i]]
经典问题------猴子选王
“循环左移法”[[i] 本帖最后由 xutingtao 于 2008-3-17 15:09 编辑 [/i]]
经典问题------猴子选王
经典问题------猴子选王**********************************************************
*********** “循环左移法” ***************
**********************************************************
初始条件:数组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]] 再顶一次 不错啊,学习啦 高手。
我觉得C学起来很困难,大家有没有好的学习方法 我先在这些过大家了 n=i+1?数组存数好像不是这样的吧!! 呵呵,不知我要学多久才能写出这个 这程序好象不对! n=-1;//将淘汰的猴子编号改为1
楼主好想你这句话有问题...应改为 将淘汰的猴子的编号改为-1
不然的话
for(i=0;i<50;i++)
{
if(n!=-1) //不然这里输出的就是最后一个被淘汰的猴子了啊 儿不是胜出者
{
printf("编号为%d的人胜出\n",i+1);
}
}
} 呵呵 不太会
路过
路过 拷回去研究下页:
[1]
