有一堆共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))