智商高的进来看看。

pp616 2006-04-01 06:16:18
有101个硬币 1个为假的。 假的和真的重量不一样。
使用天平称2次 要求确定假的和真的谁重
...全文
284 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
WaveYang 2006-04-03
  • 打赏
  • 举报
回复
呵呵,从来没有得过这么多分,爽啊。 谢谢^_^.
pp616 2006-04-02
  • 打赏
  • 举报
回复
3X+Y=101
X>=Y
X>0
Y>0
这种方式叫思维不严密。请自己演算一下你第2次发帖的可行性。

波光·弦影 正解!
unsignedmeme 2006-04-02
  • 打赏
  • 举报
回复
而针对X的取值更精确点应该是:
int X,Y;
for(X=0;X<=(101/3);X++)
for(Y=X;Y>=0;Y--)
if(101==X*3+Y)
printf("GroupA:%d GroupB:%d GroupC:%d GroupD:%d\r\n",X,X,X,Y);
unsignedmeme 2006-04-02
  • 打赏
  • 举报
回复
===============================
int X,Y;
for(X=0;X<=101;X++)
for(Y=X;Y>=0;Y--)
if(101==X*3+Y)
printf("GroupA:%d GroupB:%d GroupC:%d GroupD:%d\r\n",X,X,X,Y);
unsignedmeme 2006-04-02
  • 打赏
  • 举报
回复
汗,不能超过三次连续回复-_-

实际不只要满足下面条件的分组(4组,前三组硬币数量为X,最后一组数量为Y)

3X+Y=101
X>=Y
X>0
Y>0

所以分组方式有如下几种:
GroupA:26 GroupB:26 GroupC:26 GroupD:23
GroupA:27 GroupB:27 GroupC:27 GroupD:20
GroupA:28 GroupB:28 GroupC:28 GroupD:17
GroupA:29 GroupB:29 GroupC:29 GroupD:14
GroupA:30 GroupB:30 GroupC:30 GroupD:11
GroupA:31 GroupB:31 GroupC:31 GroupD:8
GroupA:32 GroupB:32 GroupC:32 GroupD:5
GroupA:33 GroupB:33 GroupC:33 GroupD:2
僵哥 2006-04-02
  • 打赏
  • 举报
回复
目前解法是13+8种,楼下的继续……
僵哥 2006-04-02
  • 打赏
  • 举报
回复
WaveYang(波光·弦影)的称法应该算是五组分法,其条件是:
4X+Y=101
4X>=Y

满足的条件有:
X=25,Y=1
X=24,Y=5
X=23,Y=9
X=22,Y=13
X=21,Y=17
X=20,Y=21
X=19,Y=25
X=18,Y=29
X=17,Y=33
X=16,Y=37
X=15,Y=41
X=14,Y=45
X=13,Y=49

第一次称时,天平的左侧和右侧各为2X的数量.
WaveYang 2006-04-02
  • 打赏
  • 举报
回复
僵哥研究好深哟,学习一下。
lvjack 2006-04-02
  • 打赏
  • 举报
回复
同意WaveYang(波光·弦影)
僵哥 2006-04-02
  • 打赏
  • 举报
回复
对于这个问题可以使用一个字符数组来模拟:
___________________________________________________________
#include <stdio.h>
//称量
int __fastcall balance(const char Balance_Left[] /*天平左侧*/,
const char Balance_Right[]/*天平右侧*/)
{
return CompareString(LOCALE_USER_DEFAULT,
0,
Balance_Left,
-1,
Balance_Right,
-1)-2;
//请参考CompareString的返回值
}
//==============================================================
//显示结果
void __fastcall ShowResult(const char fakeCoin/*假币币值*/,
const char Coin, /*真币币值*/
const int Result /*为方便对结果进行检验直接传结果*/
/*而不是由币值来判定*/)
{
//假币比真币轻
char buff[80];
if(1==Result)//假币比真币重
sprintf(buff,"假币[%c,ASCII:%d]比真币[%c,ASCII:%d]重",fakeCoin,fakeCoin,Coin,Coin);
else
sprintf(buff,"假币[%c,ASCII:%d]比真币[%c,ASCII:%d]轻",fakeCoin,fakeCoin,Coin,Coin);
MessageBox(NULL,buff,"结果",MB_OK);
}
//==============================================================
void __fastcall TheWeightOfFakeCoin()
{
char Coins[102]; //硬币
char Coin=random(26)+'A'; //定义真硬币
memset(Coins,Coin,101); //暂时先放101个真硬币
Coins[101]='\0'; //为了显示方面加个'\0'省得在某些大意的人们那里操作内存溢出
char fakeCoin; //假硬币
while(Coin==(fakeCoin=random(26)+'A')); //给出一个“假”的硬币
Coins[random(101)]=fakeCoin; //把假硬币在101个真硬币当中随机替换一个

char GroupA[34],GroupB[34],GroupC[34],GroupD[3];//分成四个组,前三组各分33个硬币
char Balance_Left[36],Balance_Right[36];//天平,最多每侧可称量35硬币

//第一组33个硬币
memcpy(GroupA,Coins,33);
GroupA[33]='\0';

//第二组33个硬币
memcpy(GroupB,Coins+33,33);
GroupB[33]='\0';

//第三组33个硬币
memcpy(GroupC,Coins+33+33,33);
GroupC[33]='\0';

//第四组2个硬币
memcpy(GroupD,Coins+33+33+33,2);
GroupD[2]='\0';

//将天平杂物清除
memset(Balance_Left,0,36);
memset(Balance_Right,0,36);

//先把GroupA和GroupB放置天平上面测平衡
memcpy(Balance_Left,GroupA,33);
memcpy(Balance_Right,GroupB,33);

//称量
int Result=balance(Balance_Left,Balance_Right);
switch(Result)
{
case 0: //天平两侧平衡
{
//将天平上的物品卸下
memset(Balance_Left,0,36);
memset(Balance_Right,0,36);

//左测天平================
//从GroupA组取两枚
memcpy(Balance_Left,GroupA,2);
//加上GroupB组
memcpy(Balance_Left+2,GroupB,33);
//========================

//右测天平================
//GroupD组
memcpy(Balance_Right,GroupD,2);
//加上GroupC组
memcpy(Balance_Right+2,GroupC,33);
//========================

//称量结果
Result=balance(Balance_Left,Balance_Right);
if(1==Result)//左测天平比右测重
//假币比真币轻
ShowResult(fakeCoin,Coin,-1);
else
//假币比真币重
ShowResult(fakeCoin,Coin,1);
break;
}
default:
{
//将天平上右侧的物品(GroupB)卸下
memset(Balance_Right,0,36);

//右侧放置GroupC
memcpy(Balance_Right,GroupC,33);

//称量结果
int Result1=balance(Balance_Left,Balance_Right);
switch(Result1)
{
case -1:
//假币比真币轻
ShowResult(fakeCoin,Coin,-1);
break;
case 0: //天平两侧相平
if(Result>0)//-1
//假币比真币轻
ShowResult(fakeCoin,Coin,-1);
else
//假币比真币重
ShowResult(fakeCoin,Coin,1);
break;
default:
//假币比真币重
ShowResult(fakeCoin,Coin,1);

}
}
}
}
僵哥 2006-04-02
  • 打赏
  • 举报
回复
33---33
如果平:
从一头取2枚到另一头,与剩下的35枚称得结果
若不平,则只用剩下的35枚当中的33枚与天平两头的任一组称得答案.
A(33),B(33),C(33),D(2)

//A(33)__B(33)

if A(33)=B(33)
{
//A(2)+B(33)__C(33)+D(2)
if A(2)+B(33)>C(33)+D(2)
//假的比真的轻
else
//假的比真的重
}
else
{

//A(33)__C(33)
if A(33)=C(33) and A(33)>B(33)
//假的比真的轻
if A(33)=C(33) and A(33)<B(33)
//假的比真的重
if A(33)>C(33) //and A(33)>B(33)
//假的比真的重
if A(33)<C(33) //and A(33)<B(33)
//假的比真的轻
}
僵哥 2006-04-02
  • 打赏
  • 举报
回复
楼上的好想不行吧! 我的方法是;
第一次分成(34,34,33) 两个34的先称.
如果平衡,则从其中一个34中拿掉一和剩下的33一起称.如果从其中一个34中拿掉一个的重的话,则真的重.反之假的重!
如果两个34的称了以后不平衡,拿掉轻的一边的一个硬币和剩下的33个一起称.如果平衡,则假的重!反之真的重!
---------------------------------------------
如果第二次称时拿掉的正好是所谓"不知轻重"的那一枚硬币呢?那这个答案不就是错误的了?
smarkz 2006-04-01
  • 打赏
  • 举报
回复
估计傻小子是不让用重量刻度吧,说的是天平,不是称。

第一次: 左50,右50:
如果两边相等,任取一枚同剩下的一枚假的比,结果立现。
如果两边不等,取任意一边左25,右25。结果立现。
哈哈,可以吧?

WaveYang(波光·弦影) 不好意思我的网页刷的慢!我是说这个答案说的不是很清楚!

smarkz 2006-04-01
  • 打赏
  • 举报
回复
楼上的好想不行吧! 我的方法是;
第一次分成(34,34,33) 两个34的先称.
如果平衡,则从其中一个34中拿掉一和剩下的33一起称.如果从其中一个34中拿掉一个的重的话,则真的重.反之假的重!
如果两个34的称了以后不平衡,拿掉轻的一边的一个硬币和剩下的33个一起称.如果平衡,则假的重!反之真的重!
WaveYang 2006-04-01
  • 打赏
  • 举报
回复
详细一点:
第一次: 左50,右50:
如果两边相等,说明假的为剩下的一枚。第二次任取上次100枚中的一枚同剩下的一枚假的比,如果假的重或轻,即为结果;

如果第一次成两边不等,记下结果。
第二次:取左边五○枚,分为各25枚放上天平。
如果不相等,则说明假的在这50枚中,根据第一次的结果知道答案;
如果相等,则说明假的另外50枚中,根据第一次的结果也能知道答案;
WaveYang 2006-04-01
  • 打赏
  • 举报
回复
估计傻小子是不让用重量刻度吧,说的是天平,不是称。

第一次: 左50,右50:
如果两边相等,任取一枚同剩下的一枚假的比,结果立现。
如果两边不等,取任意一边左25,右25。结果立现。
哈哈,可以吧?


kmfangxun 2006-04-01
  • 打赏
  • 举报
回复
第一次 全部称:重量为xAll,第二次称一枚:重量为x1

if(x1为False硬币)
{
xz = (xAll-x1)/100;
xf=x1;
}
else
{
xf=xAll-100*x1
xz=x1;
}

if(xz > xf )
Show("真的重");
else if(xz > xf)
Show("假的重");
else
Show("一样重");



552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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