减治法求解假硬币问题

减治法求解假硬币问题

减治法采取划分后选择计算的思想,利用一个问题和同样较小规模的问题之间的某种关系进行划分。我们先确立这种关系,然后既可以从顶至下,也可以从底至上地来运用该关系,将大问题分解成小问题来解决,像是层层嵌套。在实际解决的过程中只针对部分子问题进行求解。

def Coin():
    if a_b_c > d_e_f:
        if a + e > d + b:  # 去掉c,f,b,e互换,关系不变,假币在a,d中
            compare(a, b, g, 0, 3)
        elif a + e == d + b:  # 假币必然是c,f中的一个
            compare(c, f, g, 2, 5)
        else:
            compare(b, e, g, 1, 4)  # 假币在b或e中
    elif a_b_c == d_e_f:  # 假币在g,h中
        compare(g, h, a, 6, 7)
    else:
        if a + e > d + b:  # b或e为假
            compare(b, e, g, 1, 4)
        elif a + e == d + b:
            compare(c, f, g, 2, 5)  # c或f为假
        else:
            compare(a, d, g, 0, 3)  # a或d为假


def compare(a, b, real, start, end):
    if a == real:
        if b > real:
            print('第{%d}枚银币是假币且偏重'%(end+1))
        else:
            print('第{%d}枚银币是假币且偏轻'%(end+1))

    else:
        if a > real:
            print('第{%d}枚银币是假币且偏重'%(start+1))
        else:
            print('第{%d}枚银币是假币且偏轻'%(start+1))


coin_list = [2,2,2,2,2,2,1,2]
a_b_c = coin_list[0] + coin_list[1] + coin_list[2]
d_e_f = coin_list[3] + coin_list[4] + coin_list[5]
a = coin_list[0]
b = coin_list[1]
c = coin_list[2]
d = coin_list[3]
e = coin_list[4]
f = coin_list[5]
g = coin_list[6]
h = coin_list[7]
print(coin_list)
Coin()


'''
def eightCoin():
      if a_b_c > d_e_f:
            if a+e > d+b:#去掉c,f,且b,e互换后,
                  #天平两端轻重关系不变,说明假币必然是a,d中的一个  
                  compare(a,b,g,0,3)
            elif a+e == d+b: #假币必然是c,f中的一个 
                  compare(c,f,g,2,5)
            else:
                  compare(b,e,g,1,4)#假币在b或e中 
      elif a_b_c == d_e_f:  # 假币在g,h之中,最好状态 
                  compare(g,h,a,6,7)
      else:
            if a+e > d+b:#b或e为假
                  compare(b,e,g,1,4)
            elif a+e == d+b:
                  compare(c,f,g,2,5)# c或f为假
            else:
                  compare(a,d,g,0,3)# a或d为假
                  
def compare(a,b,real,indexa,indexb):
      if a == real:
            if b > real:
                  print('第{0}枚银币是假币且偏重'.format(str(indexb+1)))
            else:
                  print('第{0}枚银币是假币且偏轻'.format(str(indexb+1)))

      else:
            if a > real:
                  print('第{0}枚银币是假币且偏重'.format(str(indexa+1)))
            else:
                  print('第{0}枚银币是假币且偏轻'.format(str(indexa+1)))

list_coin = [1,1,1,1,1,1,1,8]
a_b_c = list_coin[0]+list_coin[1]+list_coin[2]
d_e_f = list_coin[3]+list_coin[4]+list_coin[5]
a = list_coin[0]
b = list_coin[1]
c = list_coin[2]
d = list_coin[3]
e = list_coin[4]
f = list_coin[5]
g = list_coin[6]
h = list_coin[7]      

if __name__ == '__main__':
     eightCoin()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为啥全要学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值