假设由29枚硬币,其中一枚假币,假币比真币重,有一个量程和精度足够的天平,怎样保证最少称重次数找出假币?
思路:
将硬币分为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,否则执行4.
2.将n分为上图的四堆,拿 a 和 b 比较,如果 a > b ,则假币在 a 中。否则假币在b中。
3.如果 a == b,则拿 a 和 c 比较。如果 a == c,则假币在d(余数堆)中。将 d 再次执行流程1,并且n=n%3。如果不等,则假币在 c 中,将 c 再次 执行流程1,并且n=(n-n%3)/3。
4.如果n==2,则将两枚硬币进行比较找出假币。
5.如果n==1,则该硬币就是假币,输出结果结束
# -*- coding: utf-8 -*-
"""
Created on Sun Oct 18 20:23:22 2020
@au