码迷,mamicode.com
首页 > 其他好文 > 详细

Exercise(13):八枚硬币

时间:2016-05-07 10:09:20      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

/*
        八枚银币
    在八枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测出这枚假币。

    检测出假硬币所在位置以及该硬币是轻还是重        

    输入:
    第一行输入八枚硬币的重量,分别用空格隔开
    输出:
    第二行输出假币在这八枚硬币中的位置
    第三行输出假币偏重or偏轻

    样例输入:
    6 6 6 6 6 9 6 6 6 6
    样例输出:
    6
    heavier

    问题分析:
        八枚硬币(a,b,c,d,e,f,g,h) 
        因为八枚硬币中 有1枚硬币与其他7枚不同。
        故可将八枚分为三组:
        1、 a,b,c 
        2、 d,e,f
        3、 g,h
        过程( 可以通过一架天平来任意比较两组硬币 );
        i、判断(a,b,c)与(d,e,f)的重量 
            (1) (a,b,c) == (d,e,f)  * 即假币必定为 g or h *
                先判断if( g > h ),再判断g(or h)是否等于(a,b,c,d,e,f)中的一个: 
                                    若是 则h(or g)为假币,并输出结果 lighter.
                                    若否 则h(or g)为假币,并输出结果 heavier.

            (2) (a,b,c) > (d,e,f)   * 即假币必定为 a or b or c or d or e or f * 
                重新分组为 (a,e) (b,d) (c,f): 交换 b,e 的位置可判断出 (a,d) 为假 or (b,e)为假.
                判断if( a+e > d+b ) 符号仍为 > :说明 假币必为(a,d)中的一枚
                    if( a+e == d+b )            说明 假币必为(c,f)中的一枚
                    if( a+e < d+b ) 符号改变 :  说明 假币必为(b,e)中的一枚 

            (3) (a,b,c) < (d,e,f)   * 即假币必定为 a or b or c or d or e or f *
                判断if( a+e < d+b ) 符号仍为 < :说明 假币必为(a,d)中的一枚
                    if( a+e == d+b )            说明 假币必为(c,f)中的一枚
                    if( a+e > d+b ) 符号改变 :  说明 假币必为(b,e)中的一枚    

        ii、由此,声明3个函数分别处理
            ①EightCoins 用于区分可能的假币组(elem1,elem2) 
            ②Compare    用于区分出假币(sham)
            ③Print      用于打印结果
        iii、代码实现如下...

*/
#include <iostream>
using namespace std;

void EightCoins(int* arr);                                          // 判断真假 
void Print(int sham,int real,int index);                            // 输出 
void Compare(int elem1,int elem2,int real,int index1,int index2);   // 判断轻重 

int main()
{
    int i;
    int arr[8];

    for( i=0; i<8; i++ )
        cin>>arr[i];

    EightCoins(arr);

    return 0;
}

// 判断轻重 
void EightCoins(int* arr)
{
    int a = arr[0],
        b = arr[1],
        c = arr[2],
        d = arr[3],
        e = arr[4],
        f = arr[5],
        g = arr[6],
        h = arr[7];
    int abc = a+b+c,
        def = d+e+f;

    if(abc > def)
    {
        if( (a+e) > (d+b) )         // 去除c,f 并 互换b,e的位置 仍然 >    说明a,d中必有一枚为假币
            Compare(a,d,g,0,3);
        else if( (a+e) == (d+b) )   // 去除c,f    (a+b) == (d+e)          说明c,f中必有一枚为假币
            Compare(c,f,g,2,5);         
        else                        // 去除c,f 并 互换b,e的位置 符号改变  说明b,e中必有一枚假币 
            Compare(b,e,g,1,4);
    }
    else if(abc == def)
            Compare(g,h,a,6,7); // 最好的情况
    else
    {
        if( (a+e) < (d+b) )         // 去除c,f 并 互换b,e的位置 仍然 >    说明a,d中必有一枚为假币
            Compare(a,d,g,0,3);
        else if( (a+e) == (d+b) )   // 去除c,f    (a+b) == (d+e)          说明c,f中必有一枚为假币
            Compare(c,f,g,2,5);         
        else                        // 去除c,f 并 互换b,e的位置 符号改变  说明b,e中必有一枚假币 
            Compare(b,e,g,1,4); 
    } 
}

// 比较真假 
void Compare(int elem1,int elem2,int real,int index1,int index2)
{
    if(elem1 == real)               
        Print(elem2,real,index2);
    else
        Print(elem1,real,index1);
}

// 输出 
void Print(int sham,int real,int index)
{
    if(sham > real)
        cout<<index+1<<endl<<"heavier"<<endl;
    else
        cout<<index+1<<endl<<"lighter"<<endl;
}

Exercise(13):八枚硬币

标签:

原文地址:http://blog.csdn.net/madbam_boo/article/details/51330883

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!