问题:12个砝码中只有一个重量不同于其它的,但不知是重还是轻,只用三次天平,找出它!
这道题就是考验大家考虑问题是否全面,当然附加了一点急转弯。
下面是分析过程
我们标识12个砝码为1,2,3,4,5,6,7,8,A,B,C,D;
取8个砝码置于天平两边,1,2,3,4 --- 5,6,7,8;
if(1,2,3,4 == 5,6,7,8);then
//则不同的那个就在A,B,C,D中的一个了
if(A,B,C == 1,2,3);then
//则不同那个就是D了
if( D > 1);then D偏重
else D偏轻
else if(A,B,C > 1,2,3);then
//则偏重的那个在A,B,C中
if(A == B);then C偏重
else if(A > B);then A偏重
else B偏重
else //A,B,C < 1,2,3;A,B,C中一个偏轻
if(A == B);then C偏轻
else if(A > B);then B偏轻
else A偏轻
else if(1,2,3,4 > 5,6,7,8);then
//则A,B,C,D是正常的砝码
if(1,A,B,C == 5,2,3,4);then
//则不同的在6,7,8中,而且不同的那个偏轻
if(6 == 7);then 8偏轻
else if(6 > 7);then 7偏轻
else 6偏轻
else if(1,A,B,C > 5,2,3,4);then
//则6,7,8是正常的砝码,
//原来重的一方还是重,轻的一方还是轻,
//这说明不同的砝码就在1,5之间
if(1 == D);then 5偏轻
else 1偏重
else //1,A,B,C < 5,2,3,4
//则不同的那个在2,3,4中,且偏重
if(2 == 3);then 4偏重
else if(2 > 3);then 2偏重
else 3偏重
else //1,2,3,4 < 5,6,7,8
//则A,B,C,D是正常的砝码
if(1,A,B,C == 5,2,3,4);then
//则不同的在6,7,8中,而且不同的那个偏重
if(6 == 7);then 8偏重
else if(6 > 7);then 6偏重
else 6偏重
else if(1,A,B,C < 5,2,3,4);then
//原来重的一方还是重,轻的一方还是轻,
//这说明不同的砝码就在1,5之间
if(1 == D);then 5偏重
else 1偏轻
else //1,A,B,C > 5,2,3,4
//则不同的那个在2,3,4中,且偏轻
if(2 == 3);then 4偏轻
else if(2 > 3);then 3偏轻
else 2偏轻
下面是实现的测试代码,
#include <stdio.h>
int main()
{
int a[12] = {3,3,3,3,3,3,3,3,3,3,3,2};
int left = 0,right = 0;
left = a[0] + a[1] + a[2] + a[3];
right = a[4] + a[5] + a[6] + a[7];
if(left == right)
{
/*则不同的那个就在A,B,C,D中的一个了*/
left = a[8] + a[9] + a[10];
right = a[0] + a[1] + a[2];
if(left == right)
{
/*则不同那个就是D了*/
if( a[11] > a[0])
printf("a[11] %d 偏重\n",a[11]);
else printf("a[11] %d 偏轻\n",a[11]);
}
else if(left > right)
{
/*则偏重的那个在A,B,C中*/
if(a[8] == a[9]) printf("a[10]偏重");
else if(a[8] > a[9]) printf("a[8]偏重");
else printf("a[9]偏重");
}
else
{
/*A,B,C < 1,2,3;A,B,C中一个偏轻*/
if(a[8] == a[9]) printf("a[10]偏轻");
else if(a[8] > a[9]) printf("a[9]偏轻");
else printf("a[8]偏轻");
}
}
else if(left > right)
{
/*则A,B,C,D是正常的砝码*/
left = a[0] + a[8] + a[9] + a[10];
right = a[4] + a[1] + a[2] + a[3];
if(left == right)
{
/*则不同的在6,7,8中,而且不同的那个偏轻*/
if(a[5] == a[6]) printf("a[7]偏轻");
else if(a[5] > a[6]) printf("a[6]偏轻");
else printf("a[5]偏轻");
}
else if(left > right)
{
/*则6,7,8是正常的砝码,*/
if(a[0] == a[11]) printf("a[4]偏轻");
else printf("a[0]偏重");
}
else
{
/*1,A,B,C < 5,2,3,4*/
/*则不同的那个在2,3,4中,且偏重*/
if(a[1] == a[2]) printf("a[3]偏重");
else if(a[1] > a[2]) printf(" a[1]偏重");
else printf("a[2]偏重");
}
}
else
{
/*1,2,3,4 < 5,6,7,8*/
/*则A,B,C,D是正常的砝码*/
left = a[0] + a[8] + a[9] + a[10];
right = a[4] + a[1] + a[2] + a[3];
if(left == right)
{
/*则不同的在6,7,8中,而且不同的那个偏重*/
if(a[5] == a[6]) printf("a[7]偏重");
else if(a[5] > a[6]) printf("a[5] 偏重");
else printf("a[6] 偏重");
}
else if(left < right)
{
/*则不同的那个在1,5中*/
if(a[0] == a[11]) printf(" a[4]偏重");
else printf("a[0]偏轻");
}
else
{
/*1,A,B,C > 5,2,3,4*/
/*则不同的那个在2,3,4中,且偏轻*/
if(a[1] == a[2]) printf("a[3]偏轻");
else if(a[1] > a[2]) printf("a[2]偏轻");
else printf("a[1]偏轻");
}
}
}