称硬币问题-Python:

一. 问题描述
现在有27枚硬币,其中有一枚假币,假币跟真币长得一摸一样,但是稍微重一些。摆在桌上有一个称重天平,要求用最小的次数找出假币,并写出算法代码。

二. 解题思路
首先,思考一下这个问题的解法,很多人开始想到的都说对开。就是把硬币分成两份,比如假如我们有9个硬币,每4一份,分成4,4,1三份,再对前两份进行称重。那么可能有3个结果:
1).两份完全相等,剩下的1个就是假币
2).第一组更重,然后继续二分称重
3).第二组更重,然后继续类似上面第二种情况进行称重

我们需要3次才能找到,这个是不是最优的解法呢,显然不是,何况现在的题目是27枚硬币!

三. 更优解法:
应该采用的是分而治之的方法,我们还是先拿简单的9枚举例,把9枚硬币分成3份,3,3,3,然后称重,应该是3种结果:
1).第一组和第二组一样重,那么假的在第三组里面,再称一次即可找出;
2).第一组更重,那么假的在第一组,再称一次即可;
3).第二组更重,那么假的在第二组,再称一次即可;

这个的算法,看起来更简介,大概需要2次,如果是27枚,只要多分一次9,9,9 ,最后3次即可。

四. 代码实现需要解决的三个问题:
第一,把硬币分3组;
第二,把分组的硬币称重;
第三,遍历寻找最重的里面的假币

1).分组问题
拿到一串硬币,我们需要分成3等份,直接用切片把列表切割一下即可。

def fenzu (coins):length=len(coins)group_a=coins[0 : length//3]group_b=coins[length//3 : length//3*2]group_c=coins[length//3*2 : length]return group_a,group_b,group_c

2).硬币称重
两种硬币进行称重对比代码实现

#称重
def chengzhong (group_a,group_b):if sum(group_a) > sum(group_b):result=('left')elif sum(group_a) < sum(group_b):result=('right')else:result =('equal')return result

3).寻找假币
这个里面分两步走,第一步先寻找假币,就是给你3组,进行判断。
如果第一组和第二组对比称重,左边重,那么假币就在第一组中;
如果第二组重,就是右边重,那么假币就在第二组重;
如果都不是,假币在第三组中。

#找假币
def find_fake(group_a,group_b,group_c):res=chengzhong (group_a,group_b)if res=='left':return group_aelif res=='right':return group_belif res=='equal':return group_c

4).遍历寻找
times 用于记录搜索的次数,而search_list是一个可变的列表,每次称重完了之后,它会变成三分之一的长度,不断的缩小,直到搜索结束。

#遍历寻找
def bianlifind(coins):times=0search_list=coinswhile len(search_list)> 1:print('search_list',search_list)g1,g2,g3=fenzu(search_list)search_list=find_fake(g1,g2,g3)times += 1fake=search_list[0]print(f'错误的硬币在第{fake}组')print(f'称重次数{times}')
coins=[1,1,1,2,1,1,1,1,1]
bianlifind(coins)

五. 总结和反思:

在以上的代码中输入的硬币个数是在整除3的情况下实现的。
在实际操作中:
当硬币个数不能整除3时,应该怎么做?

六. 扩展题目:
在n枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币.

七. 思路:
将硬币分为3堆,则每堆的硬币数量为 n/3 ,但是这是在 n%3==0 的情况下才能成立,所以我们将 n 枚硬币分为 3 堆加 1 堆 余数堆(余数堆可能为0),则可分为如下(n-n%3)/3, (n-n%3)/3, (n-n%3)/3, n%3。
如下分组:
a堆: (n-n%3)/3
b堆: (n-n%3)/3
c堆: (n-n%3)/3
d(余数堆): n%3

八、逻辑过程:

  1. 判断n中的硬币数量,如果n>2则执行2,否则执行5.
  2. 将n分为上图的四堆,拿 a 和 b 比较,如果 a == b ,则 假币在 c 或 d 中。否则假币在 a 或 b 中。
  3. 如果 a == b,则拿 a 和 c 比较。如果 a == c,则假币在d(余数堆)中。将 d 再次 执行流程1,并且n=n%3。如果不等,则假币在 c 中,将 c 再次 执行流程1,并且n=(n-n%3)/3。
  4. 如果 a != b,则拿 a 和 c 比较。如果 a == c,则假币在b中,将 b 再次 执行流程1,并且n=(n-n%3)/3。如果不等,则假币在 a 中,将 a 再次 执行流程 1,并且n=(n-n%3)/3。
  5. 如果n==2,则将两枚硬币进行比较找出假币。
  6. 如果n==1,则该硬币就是假币,输出结果结束。

九.逻辑图:

27枚硬币,找出较重的一个-Python相关推荐

  1. n枚硬币找出假币问题(包含一枚假币)

    问题描述: 在n枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重.可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检测这枚假币(以下提供两种方 ...

  2. (2013.05.05)N枚硬币找1枚假币

    N枚硬币找1枚假币 ――Neicole (2013.05.05) 0. 问题描述 共有N枚硬币,一个天平,在这N枚硬币中有一枚假币,设法找出该枚假币. 1. 原理示例(减治法) 概要: 如上图所示,假 ...

  3. 找出最重的苹果C语言

    题目标题: 找出最重的苹果(彭玉旭) 题目描述: 小明有n个苹果(n<20),每一个苹果都有一定的重量,请找出最重的苹果,并输出该苹果的重量 输入描述: 第一个整数是n,表示苹果的个数,接下来的 ...

  4. 硬币问题(随机生成假硬币 找出它的位置)

    一.问题描述 如果有16个硬币,都是一元的 重量是6g,其中有1个是假硬币重量是5g,要求找出假的那个? 实现要求: (1)需要一个数组 int a[17]; (2)所有数组一开始全部给初始值6 (3 ...

  5. 现代密码学—密码学基本编码实践 16进制向base64编码转换 等长16进制字符串异或 找出密钥并破解密文 python

    实验地点:E楼III区503 实验时间:11.17 一.实验室名称:攻防实验室 二.实验项目名称:密码学基本编码实践 三.实验学时:6学时 四.实验原理: Base64是网络上最常见的用于传输8Bit ...

  6. 算法数据结构面试分享(十一)火眼金睛,从队伍里迅速找出那唯一的一个双胞胎

    题目:假设你有一个用1001 个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1 到1000(包括1000)之间.此外,除一个数字出现两次外,其他所有数字只出现一次.假设你只能对这个数 ...

  7. 重集合中找出最相近的一个数字

    1.网友提供代码 1 private static decimal getNear(List<decimal> num, decimal target) 2 { 3 List<dec ...

  8. 找出数组中每一个元素右边第一个大于它的数

    解题思路: 整体思路有点像映射的关系,如果存在对应元素的比它第一个大的数,就在一个数组对应位置存在这个大值,具体思路如下: 利用栈,从左到右依次压入数组中元素的索引,每次判断待压入的下一个元素是否大于 ...

  9. python怎么用for循环找出最大值_如何获取Python简单for循环索引

    如何获取Python简单for循环索引 这篇文章主要介绍了如何获取Python简单for循环索引,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Py ...

最新文章

  1. OpenCV神经网络ANN代码编译运行与解读(一)
  2. Python基础知识(第五天)
  3. 【Linux】一步一步学Linux——sudo配置文件详解(106)
  4. PHP Fatal error: Uncaught think\\exception\\ErrorException: error_log相关解决方法
  5. 树形结构 —— 并查集
  6. spring中文参考手册-核心技术_ioc
  7. mac上python无法import redis
  8. js如何监听元素事件是否被移除_js 监听事件的叠加和移除 -
  9. 利用python解析手机通讯录
  10. ubuntu14安装火狐浏览器(firefox)中国版
  11. JAVASE,JAVAEE,JAVAME的区别
  12. 2023郑州大学计算机考研信息汇总
  13. Unity学习资源(超全)汇总 基础+项目+进阶+面试
  14. java自动往数据库里插shuaku_x大x鸟的青鸟云课堂自动答题实现原理
  15. 南京邮电大学网络攻防平台WriteUP——WEB(上)
  16. Unity警告 Trying to Invoke method: PlayManager.ReturnTheMainMenu couldn‘t be called.
  17. pygame 实现键盘鼠标映射
  18. 我的华硕A3E笔记本 cpu-z 抓图
  19. 通信的基本概念与通信系统的组成
  20. 给你三个ASCII字符(不含空白字符:包括空格、制表符\t、回车换行符\n),找出其中最大的那个

热门文章

  1. codevs 1083
  2. 汉文SEO大牛教你如何创建网站地图-seo必修课
  3. 苹果(mac)电脑安装eclipse步骤
  4. ACM模板 素数打表
  5. 6.2.1mnist _eval
  6. C++创建线程并操作临界资源
  7. Qt QPushButton 添加图片
  8. 转战C#---day2
  9. cuda10.1+pytorch1.7配置centernet环境
  10. fisheye使用mysql_Dual-fisheye viewer