假币问题(C/C++)

假币问题

1.已知假币比真币轻

#include<iostream>
using namespace std;
const int N=8;
int a[N]={2,2,1,2,2,2,2,2};
int  Coin(int low,int high,int n)
{
    int i,num1,num2,num3;
    int add1=0,add2=0;
    if(n==1)
        return low+1;
    if(n%3==0)
        num1=num2=n/3;
    else
        num1=num2=n/3+1;
    num3=n-num1-num2;
    for(i=0;i<num1;i++)
        add1=add1+a[low+i];
    for(i=num1;i<num1+num2;i++)
        add2=add2+a[low+i];
    if(add1<add2)
        return Coin(low,low+num1-1,num1);
    else if(add1>add2)
        return Coin(low+num1,low+num1+num2-1,num2);
    else
        return Coin(low+num1+num2,high,num3);
}

int main()
{
    cout<<"假币序号为:";
    cout<<Coin(0,7,8)<<endl;
    return 0;
}

2.未知假币和真币的轻重

#include<iostream>
using namespace std;

//函数声明
void Coin(int arr[]);
void compare(int a, int b,int real, int index1,int index2);
void print(int fake, int real, int i);

int main()
{
    int arr[8];
    //这里输入a、b、c、d、e、f、g、h的重量
    cout<<"请输入八枚硬币:"<<endl;
    for(int i = 0; i < 8; i++)
    {
        cin>>arr[i];
    }
    Coin(arr);
    return 0;
}

void Coin(int arr[])
{
    //取数组中的前6个元素分为两组进行比较abc,def
    //会有a+b+c > d+e+f | a+b+c == d+e+f | a+b+c < d+e+f 三种情况
    int abc = arr[0] + arr[1] + arr[2];
    int def = arr[3] + arr[4] + arr[5];
    int a = arr[0];
    int b = arr[1];
    int c = arr[2];
    int d = arr[3];
    int e = arr[4];
    int f = arr[5];
    int g = arr[6];
    int h = arr[7];
    if(abc > def)        //6枚硬币必有一枚假币,g,h为真币
    {
        if((a + e) > (d + b))    //去掉c,f,且b,e互换后,没有引起天平变化,说明假币必然是a,d中的一个
        {
            compare(a,d,g,0,3);

        }
        else if((a + e) == (d + b))
        {
            compare(c,f,g,2,5);
        }
        else
        {
            compare(b,e,g,1,4);
        }
    }
    else if(abc == def) //假币在g,h之中,最好状态
    {

        if(g == a)
        {
            print(h,g,7);
        }
        else
        {
            print(g,h,6);
        }
    }
    else                //abc < def 这两组存在一枚假币,g,h为真币
    {
        if((a + e) > (d + b))
        {
            compare(b,e,g,1,4);
        }
        else if((a + e) == (d + b))
        {
            compare(c,f,g,2,5);
        }
        else
        {
            compare(a,d,g,0,3);
        }
    }

}
/**
* 取出可能有一枚假币的两枚假币,作为参数a和参数b
* real表示真币的重量,index1为第一枚硬币的下标,index2为第二枚硬币的下标
*/
void compare(int a, int b,int real, int index1,int index2)
{
    if(a == real)
    {
        print(b,real,index2);
    }
    else
    {
        print(a,real,index1);
    }
}
void print(int fake, int real, int i)
{
    if(fake > real)
    {
        cout<<"位置在:"<<(i + 1)<<"是假币,"<<"且假币偏重";
    }
    else {
        cout<<"位置在:"<<(i + 1)<<"是假币,"<<"且假币偏轻";
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40513088/article/details/85317563