二分法和分治法找假币的问题代码

img

img

img


def find_coin(a,L):
    x = len(L) # 得到钱币数量
    print(a,L) # 输出当前索引起始位置及当前称重的钱币列表
    if x == 1: 
        return a # 数量为1则返回这枚钱币的位置索引
    if x%2 == 1: # 如果数量是单数
        x = x - 1 # 去掉最后1枚
        y = 1  # 计数,表示去掉了1枚
    else: y = 0 # 偶数则清除计数
    
    if sum(L[:x//2])<sum(L[x//2:x]): # 如果前半重量和小于后半
        return find_coin(a,L[:x//2]) # 对前半继续称重
    elif sum(L[:x//2])>sum(L[x//2:x]): # 如果前半重量和大
        return find_coin(a+x//2,L[x//2:x]) # 对后半进行称重
    else: # 如果前半后半重量一致
        if y == 0: # 如果没有计数,则没有假币
            return -1 # 没有假币,返回-1
        else:
            if L[x]<L[0]: # 如果剩余的这1枚钱币重量小于第一枚
                return a+x # 返回这枚钱币的索引位置
            else:
                return -1 # 重量一致则返回没有假币

a = [3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2] # 自行替换成 input
b = find_coin(0,a) # 根据输入内容得到索引
print('position is: {}, weight is: {}.'.format(b,a[b])) # 格式化输出