砝码称重问题

22 篇文章 0 订阅

问题: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]偏轻");
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值