N枚硬币问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/arthu6/article/details/85319560

问题定义:已知N枚硬币质量,其中有一枚假币(或轻或重),请找出假币

思路:

  1. 若N<3,无法判断
  2. 若范围缩小至一枚硬币,拿一枚真币比较轻重
  3. 若范围缩小至两枚硬币,拿一枚真币与其中一枚比较轻重,缩小范围至一枚硬币
  4. 若范围在三枚以上,将硬币三分,左边num/3枚,右边num/3枚,其余放中间(num为范围大小)。

            4.1若左边硬币质量等于右边,缩小范围到中间

           4.2若左边硬币质量等于num/3枚真币的质量,缩小范围到右边

                     4.2.1 若不等于,假币范围在左边

代码加注释:

#include<iostream>
#include<cstdlib>
using namespace std;
#define N 1005
void Judge(int *a,int n,int p,int q)
{
    if(n<3)
    {
        cout<<"无法判断"<<endl;
        return ;
    }
    if(p==q)//范围缩小到一枚硬币
    {
        if(p>0)
        {
            if(a[p]>a[0])
            {
                 cout<<"假币序号为"<<p+1<<",假币重量为"<<a[p]<<",且假币较重!"<<endl;
            }
            else
               cout<<"假币序号为"<<p+1<<",假币重量为"<<a[p]<<",且假币较轻!"<<endl;
        }
        else
        {
             if(a[p]>a[n-1])
            {
                 cout<<"假币序号为"<<p+1<<",假币重量为"<<a[p]<<",且假币较重!"<<endl;
            }
            else
               cout<<"假币序号为"<<p+1<<",假币重量为"<<a[p]<<",且假币较轻!"<<endl;
        }
    }
    else if(q-p==1)//范围缩小到两枚硬币
    {
        if(p>0)
        {
            if(a[p]==a[0]) Judge(a,n,p+1,q);
            else           Judge(a,n,p,q-1);
        }
        else if(q<n-1)
        {
             if(a[p]==a[n-1]) Judge(a,n,p+1,q);
            else           Judge(a,n,p,q-1);
        }
    }
    else if(p<q)//范围在三枚硬币以上
    {
        int temp=(q-p+1)/3;
        int sum1=0,sum2=0;
        for(int i=0;i<temp;i++)
        {
            sum1+=a[p+i];
            sum2+=a[q-i];
        }
        if(sum1==sum2)
        {
            Judge(a,n,p+temp,q-temp);
        }
        else
        {
            if(sum1==a[p+temp]*temp)
            {
                Judge(a,n,q-temp+1,q);
            }
            else
            {
                Judge(a,n,p,p+temp-1);
            }
        }
    }
}
int main()
{
    int a[N],n;
    cout<<"请输入硬币枚数:";
    cin>>n;
    cout<<"请输入硬币质量:";
    for(int i=0;i<n;i++)
        cin>>a[i];
    Judge(a,n,0,n-1);
    return 0;
}

截图:

猜你喜欢

转载自blog.csdn.net/arthu6/article/details/85319560