有一堆共n枚硬币,其中一枚是假币,外观上无法区分,只知道假币的重量稍轻。要求仅使用一个天平,使用最少的重量比较次数找出假硬币。

有一堆共n枚硬币,其中一枚是假币,外观上无法区分,只知道假币的重量稍轻。要求仅使用一个天平,使用最少的重量比较次数找出假硬币。

将n个硬币分成数量相同的两堆,如果n为偶数,每堆的硬币个数为n/2;

如果n为奇数,每堆的硬币个数为(n-1)/2,两堆之外还会剩余一个硬币。

将两堆硬币上天平比较重量,如果有一堆较轻,那么假的硬币必然在轻的那一堆中。如果两堆硬币重量相等,且两堆之外有一个剩余硬币,则那个剩余硬币就是假硬币。如果两堆硬币重量相等,且两堆之外没有剩余硬币,则查找任务失败,未发现假硬币。

编写函数findFalseCoin(coins,start,n)并调用

实现"在读入的coins列表中,从下标start开始的n个硬币中查找假硬币"

【输入形式】
【输出形式】
【样例输入】

100,100,100,99,100,100,100,100,100

【样例输出】

Fake coin:3

【样例说明】

【评分标准】

# -*- coding: utf-8 -*-
"""
Created on Fri Oct 28 18:26:19 2022

@author: hp
"""

def weightcal(coins,left,right):
    sum=0
    for i in range(left,right):
        sum+=coins[i]
    
    w=sum/(max(right-left,1))
    return w
global count

def findFalseCoin(coins,start,end):
    count=0
    if(start>=end ):
        return start
    else:
        w_left=weightcal(coins,start,int( (end+start)/2)  )
        # print(w_left)
        w_right=weightcal(coins,int( (end+start)/2),end)
        # print(w_right)
        if (w_left==w_right ):
            return -1
        elif(w_left<=w_right):
            index=findFalseCoin(coins,start,int( (end+start)/2))  
        elif(w_left>=w_right):
            index=findFalseCoin(coins,int( (end+start)/2),end)
        return index
            
            
coins=list(map(eval,(input().split(','))))
n=findFalseCoin(coins,0,len(coins))
if n==-1:
    print("Fake coin is not found")
else:
    print("Fake coin:{}".format(n))



猜你喜欢

转载自blog.csdn.net/X131644/article/details/127576869