寻找假银币

寻找假银币是一个非常有趣的智力题目,寻找假银币的大意如下:

  现在有8枚银币,其中一枚是假币。但是,从外观和做工上无法分辨哪枚是真币哪枚是假币,只知道假币的重量要比真币稍轻。则要求仅用一个天平,如何以最少的步骤寻找到假银币?

1. 寻找假银币算法

可以采用递归分治的思想来求解这个问题,操作步骤如下:

(1)首先为每个银币编号,然后可以将所有的银币等分为两份,放在天平的两边。

(2)因为假银币的分量较轻,因此天平较轻的一侧中一定包含假银币。

(3)再将较轻的一侧中的硬币等分为两份,重复上述做法。

(4)直到剩下两枚硬银币,可用天平直接找出假银币来。

这种方法在银币个数比较多时便显出了优势。照此思路编写寻找假银币问题求解的算法如下:

    static int falseCoin(int coin[],int low,int high){
        int i,sum1,sum2;
        int re=0;
        sum1=sum2=0;
        if(low+1==high){
            if(coin[low]<coin[high]){
                re=low+1;
                return re;
            }else{
                re=high+1;
                return re;
            }
        }
        //如果n是偶数
        if((high-low+1)%2==0){
            //记录前一半的重量
            for(i=low;i<low+(high-low+1)/2;i++){
                sum1+=coin[i];
            }
            //记录后一半的重量
            for(i=low+(high-low+1)/2;i<=high;i++){
                sum2+=coin[i];
            }
            if(sum1<sum2){
                re = falseCoin(coin,low,low+(high-low+1)/2-1);
            }else if(sum1>sum2){
                re = falseCoin(coin,low+(high-low+1)/2,high);
            }
        }else{        //n为奇数
            //记录前一半的重量
            for(i=low;i<low+(high-low)/2;i++){
                sum1+=coin[i];
            }
            //记录后一半的重量
            for(i=low+(high-low)/2+1;i<=high;i++){
                sum2+=coin[i];
            }
            if(sum1<sum2){
                re = falseCoin(coin,low,low+(high-low)/2-1);
            }else if(sum1>sum2){
                re = falseCoin(coin,low+(high-low)/2+1,high);
            }else{
                re=low+(high-low)/2+1;
                return re;
            }
        }
        return re;
    }

2. 寻找假银币求解完整代码

package com.cn.suanfaquti;

import java.util.Scanner;

public class FalseCoin {
    static final int MAXNUM=30;    //最大硬币数
    static int falseCoin(int coin[],int low,int high){
        int i,sum1,sum2;
        int re=0;
        sum1=sum2=0;
        if(low+1==high){
            if(coin[low]<coin[high]){
                re=low+1;
                return re;
            }else{
                re=high+1;
                return re;
            }
        }
        //如果n是偶数
        if((high-low+1)%2==0){
            //记录前一半的重量
            for(i=low;i<low+(high-low+1)/2;i++){
                sum1+=coin[i];
            }
            //记录后一半的重量
            for(i=low+(high-low+1)/2;i<=high;i++){
                sum2+=coin[i];
            }
            if(sum1<sum2){
                re = falseCoin(coin,low,low+(high-low+1)/2-1);
            }else if(sum1>sum2){
                re = falseCoin(coin,low+(high-low+1)/2,high);
            }
        }else{        //n为奇数
            //记录前一半的重量
            for(i=low;i<low+(high-low)/2;i++){
                sum1+=coin[i];
            }
            //记录后一半的重量
            for(i=low+(high-low)/2+1;i<=high;i++){
                sum2+=coin[i];
            }
            if(sum1<sum2){
                re = falseCoin(coin,low,low+(high-low)/2-1);
            }else if(sum1>sum2){
                re = falseCoin(coin,low+(high-low)/2+1,high);
            }else{
                re=low+(high-low)/2+1;
                return re;
            }
        }
        return re;
    }
    public static void main(String[] args) {
        int[] coin=new int[MAXNUM];
        int i,n,result;
        System.out.println("分治法求解假银币问题!");
        System.out.print("请输入银币总个数:");
        Scanner input = new Scanner(System.in);
        n=input.nextInt();
        System.out.print("请输入银币重量:");
        for(i=0;i<n;i++){
            coin[i]=input.nextInt();
        }
        result = falseCoin(coin,0,n-1);    //求解
        System.out.printf("在上述%d个银币中,第%d个银币是假的!",n,result);
    }

}

程序运行结果如下:

分治法求解假银币问题!
请输入银币总个数:7
请输入银币重量:2 2 1 2 2 2 2
在上述7个银币中,第3个银币是假的!
时间: 2024-11-07 12:34:35

寻找假银币的相关文章

算法目录

1. 一次一密加密.解密算法 2. 位加密.解密算法 3. 替换加密.解密算法 4. 换位加密.解密算法 5. 寻找假银币 6. 八皇后问题 7. 窃贼问题 8. 汉诺塔算法 9. 括号匹配算法求解(用栈实现) 10. 最短路径(图中两点间最短路径) 11. 城市之间的最短总距离(最小生成树算法) 12. 简单的约瑟夫环算法 13. 动态数组排序实例 14. 折半查找算法 15. 字符串数组排序的快速排序实现 16. 插入排序反序排序 17. 归并排序算法 18. 堆排序算法 19. 快速排序算

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问

分冶算法思想

1.分冶算法思想是将一个计算复杂的问题分为规模较小,计算简单的问题,,然后综合各个小问题得到最终问题的答案. 2.分冶算法的执行过程 对于一个对魔为N的问题,若该问题可以容易的解决,则直接解决,否则执行下面的步骤. 将该分解为M个规模较小的子问题,子问题相互独立,并且与原问题形式相同. 递归的解这些问题, 然后,将各子问题的姐合并得到原问题的解. 3.分冶算法例子 java实现: package com.sjx.test1;import java.util.Scanner; public cla

“假学习“&amp;”真学习“?(摘)

什么叫做“假学习”? 一.看书 买一堆书,有空看看.看书,这是典型的假学习.看书看不懂还在看,就是假学习,欺骗自己,安慰自己正在学习而已.专业书都写得很好,但大都是写给已经懂的人看的.看书的最大作用就是证明自己看书是学不到东西的,然后只有寻找其他途径. 建议:把书合上,想一想,你想学的东西东西到底是要干什么用的,要掌握到什么程度才够用.实在不行,快速看完,也好过慢慢磨着看完,当你觉得什么时候去看,可以看懂了再去看,还是那句话,不是不看,看的时机对不对而已. 二.听课 听课,记笔记.很常见的假学习

寻找通用汇点

// Graph2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<queue> using namespace std; typedef int Vertex; #define NotAVertex 0 #define INF 65536 //定义链表节点//////////////////////////////////// typedef struct Tree

C2C的道德边界:沦为从假运单到假病条的供假渠道

你可能刚开始学会不去看网购平台上商品回评中的虚假好评,却又要开始应对同事在朋友圈等平台买来的虚开病假条带来的困扰.最近各大媒体包括党报热传的网购病假条事件,再度将人们的目光集中在这个C2C模式之上.从淘宝.QQ网购到如今火爆的微商,"C2C"模式因其低门槛让不少人找到售卖自己身边各种货品的通道,而也因其监管弱逐渐沦为各种肮脏浑水.汤水之地. 制假胆量大到公开售卖 非法票据横行 每到国家法定节假日,网上总会流传出各种版本的"拼假攻略",把原本数天的假期拉长到十数天,而

提速降费大“忽悠” 运营商为何假“慷慨”

真正要不"忽悠",只有挖掘增值付费的可能和新的利润池,运营商才可能实现消费者无限接近于零的资费需求. 文/张书乐 国内三大电信运营商集体提出提速降费"N大举措".然而运营商的"慷慨"并没有换来用户的好评,而是被质疑缺乏诚意,隔靴搔痒.这种巨大的落差,暴露出了什么问题?为此,<中国商报>记者张惠和笔者进行了一番探讨. 笔者以为,在提速降费上的冲突,主要表现为公众长期以来对资费不合理的"积怨",资费长期以来存在地域差别

渠道商用假流量冒充真实用户

创业者很苦鳖的,苦于创意,苦于开发,苦于用户体验. 创业者很苦鳖的,就算把产品做好了,不推广也很难获得用户. 创业者很苦鳖的,遇上无良渠道商,花钱做推广,花时间做换量,可产品还是不见起色. 看看一个同样苦鳖的开发者赵学童鞋的自述吧. 我做数据挖掘技术出身,并从事推广工作三年,App付费推广的作假现象已屡见不鲜, 这次终于长见识了,见过作假的,没有见过那么扯淡的. 数万元推广费用,获得上万激活量,只有7个真实用户,当然,还不排除这7个"真实"全是这个坑爹渠道的测试人员,产品.运营.商务的

转:什么叫做“假学习”?什么叫做“真学习”?

什么叫做"假学习"? 一.QQ群      一天上班开始看QQ群,聊到下班.里面争论的火热.美其名曰在学习,实际上你什么都没学到.好记性不如烂笔头.争论百变,不如看则帖子.  因为你在QQ群里争论的都是你会的东西(不会的东西,你也不会争论).所以你永远学不到新的东西.不如看看看一则你能学到的贴子.  二.看书     买一堆书,有空看看.看书,这是典型的假学习.看书看不懂还在看,就是假学习,欺骗自己,安慰自己正在学习而已.专业书都写得很好,但大都是写给已经懂的人看的.看书的最大作用就是