n 枚の硬貨が山積みになっており、そのうちの 1 枚は偽造硬貨であり、偽造硬貨の方が重量がわずかに軽いことを除いて、外観では区別がつきません。最小数の重量比較を使用して偽造硬貨を検出するには、秤を 1 つだけ使用する必要があります。
n 枚のコインを同じ枚数の 2 つの山に分けます。n が偶数の場合、各山のコインの数は n/2 です。
n が奇数の場合、各山のコインの数は (n-1)/2 となり、2 つの山の外側に 1 枚のコインが残ります。
2 つのコインの山を秤に乗せて重さを比較し、一方のコインの方が軽い場合、偽物のコインは軽い方の山にあるはずです。 2 つのコインの山の重さが同じで、2 つの山の外側に残りのコインがある場合、その残りのコインは偽コインです。 2 つのコインの山の重さが同じで、2 つの山の外側にコインが残っていない場合、検索タスクは失敗し、偽のコインは見つかりません。
関数 findFalseCoin(coins,start,n) を作成し、呼び出します
「読み込んだコインリストの添字先頭からn個のコインの中から偽コインを検索する」を実装
[入力フォーム]
[出力フォーム]
[入力例]
100,100,100,99,100,100,100,100,100
【出力例】
偽コイン: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))