在八枚银币中,有一枚是假币,并且我们已知这一枚假币与其他七枚真币的重量不同,但不知道这一枚假币与其他七枚真币相比较而言是轻还是较重。我们可以通过一架天平来任意比较两组银币,设计一个高效的算法来检测出这一枚假币。
算法分析
大致算法过程见图1,以下为详细分析:
用一个数组存储八枚银币,首先将其分为两组:coins[0]、coins[1]、coins[2]和coins[3],coins[4],coins[5]进行比较。
(1)如果coins[0]+coins[1]+coins[2]==coins[3]+coins[4]+coins[5],就可以肯定这一枚有问题的硬币在coins[6]和coins[7]中。那么就比较coins[6]和coins[7]:
①如果coins[6]>coins[7],那么再比较coins[6]和coins[0]。
如果coins[6]=coins[0],那么就说明coins[7]为假币且较轻。如果coins[6]>coins[0],那么就说明coins[6]为假币且较重。
②如果coins[6]<coins[7],那么再比较coins[7]和coins[0]。
如果coins[7]=coins[0],那么就说明coins[6]为假币且较轻。如果coins[7]>coins[0],那么就说明coins[7]为假币且较重。
(2)如果coins[0]+coins[1]+coins[2]>coins[3]+coins[4]+coins[5],就说明这六枚硬币中必有一枚为假币,同时也说明,coins[6],coins[7]为真币。这时可将天平两端各去掉一枚硬币,假设去掉coins[2]和coins[5],与此同时,将天平两端的硬币各换一枚,假设硬币coins[1]和coins[3]作了互换,然后进行第二次比较,比较的结果同样可能有三种,这一枚有问题的硬币在这6个硬币中,那么再比较coins[0]+coins[3]和