算法—查找假币

简介: 算法—查找假币

查找假币

  • 题目描述:
    一个袋子里有n (n>3) 个银币,其中一枚是假币,并且假币和真币一模一样, 肉眼很难分辨, 目前只知道假币比真币的重量轻一点。 所以采用的是天平进行称重找出假币。 请给出这样的操作。

本题采用的是分治法进行求解问题

初始将硬币分成两份, 将两份分别分在天平两边,寻找到分量少的一份。 则假币一定在分量少的一份。之后一直调用该算法,则可一直找到最后那个假币。

代码实现

#include <iostream>
#include <cstdlib>
using namespace std;
const int MAXNUM = 100;
int falseCoin(int weight[], int lhs, int rhs)
{
    if (lhs == rhs)
        return lhs + 1;
    //如果只剩下两个银币,则较轻的那个便是假币
    else if (lhs == (rhs - 1))
    {
        return weight[lhs] < weight[rhs] ? lhs + 1 : rhs + 1;
    }
    int lsum = 0, rsum = 0;
    //如果偶数个银币,则比较两等份
    if ((rhs - lhs + 1) % 2 == 0)
    {
        for (int i = lhs; i < (lhs + (rhs - lhs + 1) / 2); i++)
        {
            lsum += weight[i];
        }
        for (int j = lhs + (rhs - lhs + 1) / 2; j <= rhs; j++)
        {
            rsum += weight[j];
        }
        //左右两份等重,则无假币
        if (lsum == rsum)
            return -1;
        else
            return (lsum < rsum) ? falseCoin(weight, lhs, lhs + (rhs - lhs) / 2) : falseCoin(weight, lhs + (rhs - lhs) / 2 + 1, rhs);
    }
    //如果奇数个银币,则比较除中间银币外的两等份
    else if ((rhs - lhs + 1) % 2 != 0)
    {
        for (int i = lhs; i < (lhs + (rhs - lhs) / 2); i++)
        {
            lsum += weight[i];
        }
        for (int j = (lhs + (rhs - lhs) / 2 + 1); j <= rhs; j++)
        {
            rsum += weight[j];
        }
        //左右两份等重,则无假币
        if (lsum == rsum && weight[lhs] == weight[lhs + (rhs - lhs) / 2])
            return -1;
        //如果两份等重,中间银币较轻,则中间银币为假币
        else if (lsum == rsum && weight[lhs] > weight[lhs + (rhs - lhs) / 2])
            return lhs + (rhs - lhs) / 2 + 1;
        //否则,返回较轻那份中的假币
        else
            return (lsum < rsum) ? falseCoin(weight, lhs, lhs + (rhs - lhs) / 2 - 1) : falseCoin(weight, lhs + (rhs - lhs) / 2 + 1, rhs);
    }
}
int main()
{
    int weight[MAXNUM];
    int n;
  cout << "请输入您的硬币数量:" <<endl;
 
    while (cin >> n)
    {
    cout << "请输入您每个硬币重量: "<<endl;
        for (int i = 0; i < n; i++)
            cin >> weight[i];
        int falsePos = falseCoin(weight, 0, n - 1);
        if (falsePos != -1)
            cout << "第" << falsePos << "个银币为假币!" << endl;
        else
            cout << "无假币!" << endl;
    }//while
    system("pause");
    return 0;
}

注意

  • 输入的假币是要比真币的重要少的
  • 这堆硬币可能是偶数和奇数我们要分情况实现
相关文章
|
3月前
|
算法
【算法】二分算法——搜索插入位置
【算法】二分算法——搜索插入位置
|
3月前
|
算法 C++
查找方式:依次查找与二分查找
查找方式:依次查找与二分查找
|
5月前
|
算法
数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)
数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)
51 0
|
6月前
查找数据
查找数据。
36 1
|
算法
查找
查找是指在图中寻找特定的节点或边的过程。在图中进行查找操作可以帮助我们找到与目标节点或边相关的信息,或者判断图中是否存在某个节点或边。 在图中进行查找操作的常见算法有: 1. 深度优先搜索(DFS):从图中的一个节点开始,沿着一条路径一直深入直到无法再深入为止,然后回溯到上一个节点,继续深入其他路径,直到找到目标节点或遍历完所有节点。 2. 广度优先搜索(BFS):从图中的一个节点开始,先访问它的所有邻居节点,然后再依次访问邻居的邻居节点,直到找到目标节点或遍历完所有节点。 3. Dijkstra算法:用于在带权有向图中找到从一个节点到其他节点的最短路径。该算法通过不断更新节点的最短距离来逐步
74 0
极速查找(1)-算法分析
极速查找(1)-算法分析
极速查找(3)-算法分析
极速查找(3)-算法分析
|
算法 索引
极速查找(2)-算法分析
极速查找(2)-算法分析
|
算法 大数据 索引
算法查找——分块查找
分块查找是折半查找(二分查找)和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。分块查找的速度虽然不如折半查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序
248 0
算法查找——分块查找
|
算法
算法查找——二分查找
算法查找——二分查找
90 0
算法查找——二分查找
下一篇
无影云桌面