某公司的一道笔试题?

xd_lzp 2001-11-04 05:36:46
12个球,从外表看上去都一样,但是有一个球和其他11个重量不同(不知道是轻还是重) 剩下的球重量一样,给一个天平,要求称3次 找出那个球. 怎样编程来实现?
...全文
363 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
pencil_xx 2001-11-09
  • 打赏
  • 举报
回复
to:21bird(世纪菜鸟:不经历风雨,怎么见彩虹!

但冰箱没有好吃的。我可不去!^_^
Go_Rush 2001-11-09
  • 打赏
  • 举报
回复
我去测试一下szwxj(甲骨文) 的方法
chorls 2001-11-08
  • 打赏
  • 举报
回复
peer4(萧疯)说的很清楚了。我也是这么想的。
pencil_xx 2001-11-08
  • 打赏
  • 举报
回复
to:ilfsm(蜀山刀客) 
(你不要这么评论别人可不可以,你自己就一定正确吗?

好好思考一下,自己笨还是别人笨
ilfsm 2001-11-08
  • 打赏
  • 举报
回复
一群糊涂虫~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请注意:球是不知道轻重的。若已经知道轻重,则只要、也必须要三次才能确定该球,否则,看运气了,三次、四次都可能。

网大(http://www.netbig.com)上情话(或许是北大)版块也讨论过这个问题,答案都让我不满意。

我认为:不知道轻重的话,最多四次(运气好了三次)即可。
7680 2001-11-08
  • 打赏
  • 举报
回复
呵呵,有理
haitaoyu 2001-11-08
  • 打赏
  • 举报
回复
xd_lzp(玩命)说的非常正确!
某鸟 2001-11-08
  • 打赏
  • 举报
回复
另一道面试题!
把大象关进冰箱分几步?

哈哈哈...
peer4 2001-11-08
  • 打赏
  • 举报
回复
szwxj(甲骨文)老兄的完全正确---已经讲得很明白了.
俺开始还以为知道轻重的,惭愧惭愧.
szwxj 2001-11-08
  • 打赏
  • 举报
回复
to : wolfman(浪人) 
你没有注意到,无论是向左偏,还是向右偏,你都可以判断出坏球的轻重,则第三次只需要用一个好球与其中的一个坏球称就可以了。
wolfman 2001-11-08
  • 打赏
  • 举报
回复
先说 “szwxj(甲骨文)”的方法,不对:
1.在b中,第1、2和3、4两种情况是分别等同的,甲重则乙轻,也就是说,只有三种情况,即天平朝左或右偏,或不偏。
2.只有不偏的情况(运气好)可以只需一次即可判断,否则还需两次。

再谈谈我的看法:
对于不知道该球是轻还是重的条件;
不管先分几组,前两次中都要有一次分三,有一次分四。
分三的话,运气好可以去掉2/3,运气差只能去掉1/3。
而分四的话,一定可以去掉1/2。
这样,两次以后,就剩下:运气好是1/3*1/2 为1/6,运气差为1/3;
如果剩1/6即2个的话,再有一次就行了,取其一与排出在外的球比较,不同,则该为该球,同则为另外一个。
如果是1/3即4个的话,就需要再多两次才行。
szwxj 2001-11-08
  • 打赏
  • 举报
回复
怎么这道题还有呀:我上初中的时候就知道这道题,我现在已经大学毕业快10年了。
第一次:4:4,有两种情况:
a、如果平,则坏球在剩下的4个中。
第二次:取剩下的2个球和称过的8个球中的2个球,2:2,也有两种情况:
a.1、如果平:则没有称过的2个球中有一个是坏的。
第三次:取称过的10个球中的1个和没有称过的2个中的一个,1:1
无论平与不平,结果我想大家已经知道了。
a.2、如果不评:则可以判断出2个中必然有一个是坏球
第三次:大家都是聪明人,我就不说了。
b、如果不平,则可以分成4个重球和4个轻球和4个好球
第二次:取2个轻球+1个重球和2个重球+1个轻球,3:3,这次要判断轻重了。
b.1、如果2个轻球+1个重球那边重,还需要称第三次吗?
b.2、如果2个重球+1个轻球那边轻,还需要称第三次吗?
b.3、如果2个轻球+1个重球那边轻,第三次还用我说么?
b.4、如果2个重球+1个轻球那边重,第三次还用我说么?
b.5、如果平了,则现在还剩下两个没有称过的球
第三次:取一个好球和剩下的两个球中的任一个,无论平与不平,结果还用我说么?

结论:虽然不知道轻重,3次足够了。
pencil_xx 2001-11-08
  • 打赏
  • 举报
回复
就是!
xd_lzp 2001-11-08
  • 打赏
  • 举报
回复
三次是肯定可以的 请大家再把我的帖子好好看看 想想
ArthurHf 2001-11-07
  • 打赏
  • 举报
回复
第一次
1. 称 1-4 与 5-8
1). 若平衡,所要找的球在9-12 则转到 2.1
2). 若不平衡, 所要找的球在1-8,记住重的一边,假设为1-4(5-8一样),则转到 2.2

第二次
2.1 称9-10
1) 若平衡,所要找的球在 11-12, 则转到 3.1
2) 若不平衡, 所要找的球在 9 -10 ,则转到 3.2

2.2 称 125 - 346
1) 若平衡, 所要找的球在 7 -8 ,则转到 3.3
2) 若125为重(轻)的一边, 所要找的球在125,则转到 3.4
3) 若346为重(轻)的一边,所要找的球在346,则转到 3.5

第三次
3.1 称 10- 11,
1) 若平衡, 所要找的球为 12
2) 若不平衡,所要找的球在 11

3.2 称 8 - 9
1) 若平衡, 所要找的球为 10
2) 若不平衡,所要找的球在 9

3.3) 称 6 - 7
1) 若平衡, 所要找的球为 8
2) 若不平衡,所要找的球在 7

3.4) 称 1-2
1) 若平衡, 所要找的球为 5
2) 若1重, 所要找的球在 1
3) 若2重, 所要找的球在 2

3.5) 称 3-4
1) 若平衡, 所要找的球为 6
2) 若3重, 所要找的球在 3
3) 若4重, 所要找的球在 4
zhangyan_qd 2001-11-07
  • 打赏
  • 举报
回复
这不叫编程,这叫用C语言表现自己的蛮力。这和直接写出解法来有什么区别?
darkmoon 2001-11-07
  • 打赏
  • 举报
回复
到数据算法里一查就知道了,我也问过这问题,不管多坏的情况三次都可以称出来,13个同12个
kingfish 2001-11-07
  • 打赏
  • 举报
回复
#include "stdio.h"

#define SUCCESS 0
#define FAIL 1

int x[13]; /* 为贴切题意 x[0] 不用 */
/* 一个异常球N与标准球比较 */
int Tzg_JudgeForLorW(int N, int Standard)
{
if(x[Standard] < x[N])
{
return 1; //N是重球
}
else
{
return 0; //N是轻球
}
}
/* 从两个球中选出异常球,已知N1重或N2轻 */
int Tzg_SeleteSBFromTwo(int N1, int N2, int Standard, int *wIsWeighter)
{
if(x[Standard] < x[N1])
{
*wIsWeighter = 1;
return N1;
}
else
{
*wIsWeighter = 0;
return N2;
}
}
int Tzg_SeleteSBFromThree(int N1, int N2, int N3, int wIsWeighter)
{
if(x[N1] == x[N2])
{
return N3;
}
else if(x[N1] > x[N2])
{
if(wIsWeighter == 1)
return N1;
else
return N2;
}
else
{
if(wIsWeighter == 1)
return N2;
else
return N1;
}

}

/***********************************************************
*函数功能 :
*输入参数 :
*输出参数 :
* wBallst 代表第几个是异常球,
* wIsWeighter 代表该异常球是重(=1)还是轻(=0)
*返回参数 :
* wWeightNum 代表称重次数
*************************************************************/
int Tzg_SeleteSecretBall(int *wBallst, int *wIsWeighter)
{
int wWeightNum =0;

if( (x[1]+x[2]+x[3]+x[4]) == (x[5]+x[6]+x[7]+x[8]) )
{ /* 意味着1--8都是标准球,异常球肯定在剩下的四个球当中 */
wWeightNum++;
if( (x[1]+x[2]+x[3]) == (x[9]+x[10]+x[11]) )
{ /* 意味着9、10、11也是标准球,异常球肯定是12 */
wWeightNum++;
*wBallst = 12;
*wIsWeighter = Tzg_JudgeForLorW(12, 1);
wWeightNum++;
return wWeightNum;
}
else if( (x[1]+x[2]+x[3]) < (x[9]+x[10]+x[11]) )
{ /* 意味着异常球在9、10、11中,且是重球*/
wWeightNum++;
*wIsWeighter = 1;
*wBallst = Tzg_SeleteSBFromThree(9,10,11,1);
wWeightNum++;
return wWeightNum;
}
else //if( (x[1]+x[2]+x[3]) > (x[9]+x[10]+x[11]) )
{ /* 意味着异常球在9、10、11中,且是轻球*/
wWeightNum++;
*wIsWeighter = 0;
*wBallst = Tzg_SeleteSBFromThree(9,10,11,0);
wWeightNum++;
return wWeightNum;
}
}
else if( (x[1]+x[2]+x[3]+x[4]) > (x[5]+x[6]+x[7]+x[8]) )
{ /* 意味着9--12都是标准球,异常球肯定在剩下的 1--8 当中 */
wWeightNum++;
if( (x[1]+x[6]+x[7]+x[8]) == (x[5]+x[10]+x[11]+x[12]) )
{ /* 说明1、5、6、7、8都是标准球,异常球在2、3、4当中,且是重球 */
wWeightNum++;
*wIsWeighter = 1;
*wBallst = Tzg_SeleteSBFromThree(2,3,4,1);
wWeightNum++;
return wWeightNum;
}
else if( (x[1]+x[6]+x[7]+x[8]) > (x[5]+x[10]+x[11]+x[12]) )
{ /* 说明1是重球 或 5 是轻球 */
wWeightNum++;
*wBallst = Tzg_SeleteSBFromTwo(1, 5, 12, wIsWeighter);
wWeightNum++;
return wWeightNum;
}
else //if( (x[1]+x[6]+x[7]+x[8]) < (x[5]+x[10]+x[11]+x[12]) )
{ /* 说明1、2、3、4、5为标准球,异常球在6、7、8中,且是轻球 */
wWeightNum++;
*wIsWeighter = 0;
*wBallst = Tzg_SeleteSBFromThree(6,7,8,0);
wWeightNum++;
return wWeightNum;
}
}
else //if( (x[1]+x[2]+x[3]+x[4]) < (x[5]+x[6]+x[7]+x[8]) )
{ /* 意味着9--12都是标准球,异常球肯定在剩下的 1--8 当中 */
wWeightNum++;
if( (x[1]+x[6]+x[7]+x[8]) == (x[5]+x[10]+x[11]+x[12]) )
{ /* 说明1、5、6、7、8都是标准球,异常球在2、3、4当中,且是轻球 */
wWeightNum++;
*wIsWeighter = 0;
*wBallst = Tzg_SeleteSBFromThree(2,3,4,0);
wWeightNum++;
return wWeightNum;
}
else if( (x[1]+x[6]+x[7]+x[8]) < (x[5]+x[10]+x[11]+x[12]) )
{ /* 说明5是重球 或 1 是轻球 */
wWeightNum++;
*wBallst = Tzg_SeleteSBFromTwo(5, 1, 12, wIsWeighter);
wWeightNum++;
return wWeightNum;
}
else //if( (x[1]+x[6]+x[7]+x[8]) > (x[5]+x[10]+x[11]+x[12]) )
{ /* 说明1、2、3、4、5为标准球,异常球在6、7、8中,且是重球 */
wWeightNum++;
*wIsWeighter = 1;
*wBallst = Tzg_SeleteSBFromThree(6,7,8,1);
wWeightNum++;
return wWeightNum;
}
}

wWeightNum = 0xff;
return wWeightNum;
}


/* 测试函数 */
main()
{
int i, wErrNum=0;
int wBallst, wIsWeighter, wWeightNum;

/* 初始化 */
for(i=1; i<13; i++)
x[i] = 2;

/* 有一重异常球的穷举 */
for(i=1; i<13; i++)
{
x[i] = 3;
wWeightNum = Tzg_SeleteSecretBall( &wBallst, &wIsWeighter );
if( (wWeightNum > 3) ¦¦ (wBallst != i) ¦¦ (wIsWeighter != 1) )
{
printf("\n\rError when the %d ball is weighter than others!", i);
wErrNum++;
}
x[i] = 2; //回复
}

/* 有一轻异常球的穷举 */
for(i=1; i<13; i++)
{
x[i] = 1;
wWeightNum = Tzg_SeleteSecretBall( &wBallst, &wIsWeighter );
if( (wWeightNum > 3) ¦¦ (wBallst != i) ¦¦ (wIsWeighter != 0) )
{
printf("\n\rError when the %d ball is lighter than others!", i);
wErrNum++;
}
x[i] = 2; //回复
}

if(wErrNum == 0)
{
printf("\n\r\n\r\n\rThe arithmatic is good !");
return SUCCESS;
}
else
{
printf("\n\r\n\r\n\rThere are all %d errors !", wErrNum);
return FAIL;
}

}
xd_lzp 2001-11-07
  • 打赏
  • 举报
回复
但是你这样称的次数太多了,因为不知道轻重 至少要多一次
ZengXi 2001-11-07
  • 打赏
  • 举报
回复
1.12球分三,每四,一边四球称之,则知轻球在三之一.(不明白?自己想吧)
2.四球分二,每二,之,得轻球在二之一.
3.还用再说吗?
赞同,不管此球是轻是重,都可以实现.
加载更多回复(28)

594

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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