一题费脑子的送分题,有兴趣的试试吧!!

hj_911 2002-06-09 01:03:25
随机产生五个数,求中间数(即大小排在中间的这个数),要求只能用6次比较
需要答案的可留下e-mail,我尽量满足,大家一起交流交流
...全文
244 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhyu 2002-06-09
  • 打赏
  • 举报
回复
假设有a1,a2,a3,a4,a5五个数
1.a1和a2比较,设较小这为a12,a3和a4比较,设较小者为a34
2.a12和a34比较,较小者为a
这时首先得出结论:a不是中间数。因为a比a1,a2,a3,a4中的其中三个数小。不失一般性,可以假设a1<a2,a3<a4,a1<a3,(可以在比较时交换a1,a2,a3,a4的值使这几个不等式成立)这时a=a1。剩下的问题可以转为如何通过三次比较找出a2,a3,a4,a5的第二小的那个数。需要注意的是这时a3和a4的大小关系在前面的比较中已经确定,在余下的比较中可以直接利用。由上面可以假设a3<a4。算法继续进行:
3.比较a2和a5,较小者为a25
4.比较a25和a3。
5.如果a25<a3,则a25不是所求的数。因为a25小于a3,a4(a3<a4)以及a2和a5中的较大者。同样a4也不是所求的数,因为a4大于a3和a25。故所求的数只能是a3或a2与a5的较大一个数。通过一次比较找出这两个数的较小一个就是所求的中间数,这时共计比较了6次。
6.如果a25>a3,a3不是所求的数。因为a3小于a25,a4以及a2和a5中的较大者。a2和a5的较大者也不是所求的数,因为a2和a5的较大者大于a3和a25。故所求的数只能是a25和a4。比较a25和a4较小的一个即为所求的中间数。这时共计也比较了6次

例如上面的例子1 2 4 5 3
比较1和2,4和5得出较小者为1和4,比较1和4较小者为1。把1排除,剩下4个数:2,4,5,3。这时已经知道4<5。继续比较2和3得出2<3。比较2和4得出2<4。有第5步排除2和5,剩下3和4比较可知3为所求。共比较了6次。

不知上面的方法有无错漏处?
huwei_008 2002-06-09
  • 打赏
  • 举报
回复
kli890@163.com
canoe_eyes 2002-06-09
  • 打赏
  • 举报
回复
taison_bo@sohu.com
颓废的老猫 2002-06-09
  • 打赏
  • 举报
回复
是二叉排序树吗?
ckc 2002-06-09
  • 打赏
  • 举报
回复
abc1812@963.net
javaenjoyer 2002-06-09
  • 打赏
  • 举报
回复
int a,b,c,d,e;
a<->b => (a>b)or(a<b)
c<->d => (c>d)or(c<d)
firstly think about the first statement:
that is (a>b)&&(c>d);
then e<->a
if (e>a) => {e>a,b; then c<->b if (c<b)=> {e>a,b>c>d;then a<->b
the smaller is the middle one} else {=>c>b,d,then c<->a the smaller is the middle one }

else(e<a)=>{a>e,b; just as the above methodes, we can get the middle one }
the other statements ,just the same as above.we get that the most sophiscated statement needs six comparations.


waYeah 2002-06-09
  • 打赏
  • 举报
回复
zhuk2002@sina.com,
谢谢,一定交流。

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧