基础算法之八硬币问题(python)

问题:
现有八枚银币a b c d e f g h,已知其中一枚是假币,其重量不同于真币,但不知是较轻或较重,如何使用天平以最少的比较次数,决定出哪枚是假币,并得知假币比真币较轻或较重。
解决方式:
将八枚硬币分成三组:a、b、c一组,d、e、f一组,g、h一组。
首先将abc与def分别放置于天平两侧,可能出现三种比较结果

(1)a+b+c>d+e+f

(2)a+b+c=d+e+f

(3)a+b+c<d+e+f

若a+b+c>d+e+f,可以肯定这六枚硬币中必有一枚为假币,同时也说明g与h为真币。这时可将天平两端各去掉一枚硬币,假设去掉c和f同时a和e互换,然后进行第二次比较,比较的结构同样有三种:

①a+e>d+b:表明变换后两端的轻重关系保持不变,从而说明假币必然是a和d中一个,这时我们只要用一枚真币(例如h)与a进行比较,就能找出假币。若a>h,则a是较重的假币;若a=h,则d为较轻的假币;不可能出现a<h的情况

②a+e=d+h:表明假币在去掉的两枚硬币c和f中,其他步骤同①

③a+e<e+h:表明对换后平衡变向,假币在b和e中,其他步骤同①

(2)(3)情况步骤类似(1)分析。
可以用图表示:
在这里插入图片描述
python代码:

def compare(coins,i,j,k):
    if coins[i]>coins[k]:
        print("假币%d较重"%(i+1))
    else:
        print("假币%d较轻"%(j+1))
def eightcoin(coins):
    if coins[0]+coins[1]+coins[2]==coins[3]+coins[4]+coins[5]:
        if coins[6]>coins[7]:
            compare(coins,6,7,0)
        else:
            compare(coins,7,6,0)
    elif coins[0]+coins[1]+coins[2] >coins[3]+coins[4]+coins[5]:
        if coins[0]+coins[3] == coins[1]+coins[4]:
            compare(coins, 2, 5, 0)
        elif coins[0]+coins[3] > coins[1]+coins[4]:
            compare(coins, 0, 4, 1);
        else:
            compare(coins, 1, 3, 0);
    elif coins[0]+coins[1]+coins[2] <coins[3]+coins[4]+coins[5]:
        if coins[0]+coins[3] == coins[1]+coins[4]:
            compare(coins, 5, 2, 0)
        elif coins[0]+coins[3] > coins[1]+coins[4]:
            compare(coins, 3, 1, 0);
        else:
            compare(coins, 4, 0, 1);

if __name__ == '__main__':
    coins=[2,2,2,2,3,2,2,2]
    eightcoin(coins)
#输出:假币5较重

参考:
https://blog.csdn.net/Hitmi_/article/details/81048125

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值