| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1620 人关注过本帖
标题:一道有趣的编程题,大家都来做一做撒
只看楼主 加入收藏
blosaa
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-17
收藏
 问题点数:0 回复次数:20 
一道有趣的编程题,大家都来做一做撒
将班里的 n 个人围成一圈,顺序编号。从第一个人开始报数(从 1 到 3 报数),凡报到3的人退出圈子,然后从下一个人重新开始,最后留下的那个人就被选为班长。请问按照这个规则,选出的班长是原来编号为第几号的那位.
搜索更多相关主题的帖子: 编程 
2007-10-21 20:38
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

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


倚天照海花无数,流水高山心自知。
2007-10-21 21:01
风的声音
Rank: 1
等 级:新手上路
帖 子:128
专家分:0
注 册:2007-3-27
收藏
得分:0 

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


一念心清净,莲花处处开。 一花一净土,一土一如来。
2007-10-21 21:03
blosaa
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-10-17
收藏
得分:0 
看别人做的有什么意思撒,自己做才过瘾,我做了一下,大家看看对不对撒???????

#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");
}
2007-10-21 21:06
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 
有结果且结果是正确的就对

方寸之内,剖天下; 方坛之内,析自我;
2007-10-21 21:36
风的声音
Rank: 1
等 级:新手上路
帖 子:128
专家分:0
注 册:2007-3-27
收藏
得分:0 
看了一下你的程序,所几个小意见吧,其实这个题目最出名的地方你没有注意到,因为这个题目设计到一个特别好的算法。
定义的数组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
chmlqw
Rank: 1
等 级:新手上路
帖 子:180
专家分:0
注 册:2007-10-11
收藏
得分:0 
以下是引用风的声音在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;这样的化不是就少了一个元素? 不太明白,希望高手指点哈

2007-10-21 22:34
iniyasha
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-10-20
收藏
得分:0 
         编译对了,输出也精确,但就是看不明!

2007-10-21 23:51
iniyasha
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-10-20
收藏
得分:0 
        总算看明了!  

2007-10-22 01:31
风的声音
Rank: 1
等 级:新手上路
帖 子:128
专家分:0
注 册:2007-3-27
收藏
得分: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编辑过]


一念心清净,莲花处处开。 一花一净土,一土一如来。
2007-10-22 08:35
快速回复:一道有趣的编程题,大家都来做一做撒
数据加载中...
 
   



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

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