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