C++算法——查找假币问题:

编写一个实验程序查找假币问题。有n(n>3)个硬币,其中有一个假币,且假币较轻,采用天平称重方式找到这个假币,并给出操作步骤。

本题采用的是分治法求解问题,因为所有的硬币里面必定有一个是假币,而且假币质量轻,
当硬币是奇数个数时,如果左右两边一样重,那么假币必定是中间那个,直接返回就可以了,
否则就去左右两边找假币,那边轻就去那边找假币,如果硬币是偶数个数时,就不会存在左
右两边相等,直接判定左右两边那边轻就可以了,那边轻就去哪边调用函数递归,知道左由
两边下标相差一或相等即可找到假币。

代码实现:

#include <iostream>
using namespace std;
#define N 1000
int SUM(int weight[], int m, int n)//求重量和
{
    int sum = 0;
    for (int i = m; i <= n; i++)
    {
        sum += weight[i];
    }
    return sum;
}
int find(int weight[], int left, int right)
{
    if (right - left == 1)//先判定再递归
        return weight[right] > weight[left] ? left : right;
    if (right == left)
        return right;
    int mid = (right + left) / 2;
    if ((right - left) % 2 == 0)//硬币数量为奇数个数时
    {
        int lw = SUM(weight, left, mid - 1);
        int rw = SUM(weight, mid + 1, right);
        if (lw == rw)
            return mid;
        lw > rw ? find(weight, mid + 1, right) : find(weight, left, mid - 1);
    }
    else if ((right - left) % 2 == 1)//硬币为偶数个数时
    {
        int lw = SUM(weight, left, mid);
        int rw = SUM(weight, mid + 1, right);
        lw > rw ? find(weight, mid + 1, right) : find(weight, left, mid);
    }
}
int main()
{
    int n;
    int weight[N] = { 0 };
    cout << "请输出硬币的个数:>\n";
    cin >> n;
    cout << "请输出各个硬币的重量:>\n";
    for (int i = 0; i < n; i++)
    {
        cout << "第" << i+1 << "个硬币的重量是:>";
        cin >> weight[i];
    }
    int sz = find(weight, 0, n - 1);
    cout << "第" << sz + 1 << "个是假币!\n";
    return 0;
}
注意:1.硬币为奇偶个数时一定要分情况讨论,头脑清晰,明确左右区间

2.递归调用前先判定,这样方便找到递归函数的出口,不至于后面混淆

  • 16
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还好有你明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值