当前位置: 代码迷 >> C语言 >> 一道有趣的编程题,大家都来做一做撒
  详细解决方案

一道有趣的编程题,大家都来做一做撒

热度:136   发布时间:2007-10-21 20:38:59.0
一道有趣的编程题,大家都来做一做撒
将班里的 n 个人围成一圈,顺序编号。从第一个人开始报数(从 1 到 3 报数),凡报到3的人退出圈子,然后从下一个人重新开始,最后留下的那个人就被选为班长。请问按照这个规则,选出的班长是原来编号为第几号的那位.
搜索更多相关的解决方案: 编程  

----------------解决方案--------------------------------------------------------

约瑟复环
搜一下很多的啦.


----------------解决方案--------------------------------------------------------

呵呵,这不就是传说中的“猴子选大王问题”吗 ?专业点叫约瑟夫环 ;


----------------解决方案--------------------------------------------------------
看别人做的有什么意思撒,自己做才过瘾,我做了一下,大家看看对不对撒???????

#include<stdio.h>

void main()
{
int i,n,a[100],m,j,k;

printf("请输入全班的人数:");
scanf("%d",&n);
k=n;
for(j=0;j<n;j++)
{
a[j]=j+1;
}
k=0; //要淘汰的计数器
m=0; //1~3
i=0;
while(k<n-1)
{
if(a[i]!=0)
{
m++;


}
if(m==3)
{
a[i]=0;
k++;
m=0;

}
i++;
if(i==n)
{
i=0;
}
}





for(i=0;i<n;i++)
{
if(a[i]!=0)
{
printf("%3d",a[i]);
}

}
printf("\n");
}

----------------解决方案--------------------------------------------------------
有结果且结果是正确的就对
----------------解决方案--------------------------------------------------------
看了一下你的程序,所几个小意见吧,其实这个题目最出名的地方你没有注意到,因为这个题目设计到一个特别好的算法。
定义的数组a[100]在for(i=0;i<n;i++)a[i]=i+1;这个语句你根本没有明白它的用处。这就是巧妙的地方,因为还要在加上一条语句a[n-1]=0;虽然你已经给这个a[n-1]赋过值了(其实本来也不用先给它赋值的 ),这样这个数组就成了一个环。每当计数器到3时,a[n]=a[n+1];那么在下一次循环的时候就没有这个数值了。当然循环的结束也发生了改变最后终止的语句就是 a[i]==i的判断;
希望你能明白!这个才是这个题目中所体现的精妙之处。
----------------解决方案--------------------------------------------------------
以下是引用风的声音在2007-10-21 22:20:47的发言:
看了一下你的程序,所几个小意见吧,其实这个题目最出名的地方你没有注意到,因为这个题目设计到一个特别好的算法。
定义的数组a[100]在for(i=0;i<n;i++)a[i]=i+1;这个语句你根本没有明白它的用处。这就是巧妙的地方,因为还要在加上一条语句a[n-1]=0.......

为什么是a[n-1]=0;这样的化不是就少了一个元素? 不太明白,希望高手指点哈


----------------解决方案--------------------------------------------------------
         编译对了,输出也精确,但就是看不明!
----------------解决方案--------------------------------------------------------
        总算看明了!  
----------------解决方案--------------------------------------------------------

呵呵,昨天晚上太晚了 ,说的也不是很明白。给你看一段吧。
for(i=0;i<n;i++)
a[i]=i+1;
a[n-1]=0;
t=0//记数用的 ;
q=p=n-1;//这里的两个值其实是作为下标,同过他们的改变数组相应变化;
do{
p=a[p];
t++;
if(t%m==0)
a[q]=a[p];
else
q=p;
}
while(a[p]!=a[p])
这个只是随手写的,呆会我给你写个全的,先好好理解一下吧。其实这个挺饶的,但是一定要记住p和 q都是下标。而a[p]和a[q]才是数组值,注意下标和数组值之间的关系;

[此贴子已经被作者于2007-10-22 8:36:20编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案