Alex Martelli 提到了一个代数解决方案,为了完整起见,我将在此处包含该解决方案。它可以通过使用联立方程来解决。作为一个简单的数学解决方案,它可能更快,至少对于大量的腿和头来说:-)
让:
H
是正面的数量;
L
是腿的数量;
C
是小鸡的数量;和
P
是猪的数量。
给定C
和P
,我们可以计算其他两个变量:
H = C + P (1)
L = 2C + 4P (2)
我将在下面详细说明计算中的每一步。毫无疑问,数学倾向可以指出可以组合步骤,但我更愿意明确。从(1),我们可以计算:
H = C + P
=> 0 = C + P - H [subtract H from both sides]
=> 0 = H - C - P [multiply both sides by -1]
=> P = H - C [add P to both sides] (3)
并将其代入(2):
L = 2C + 4P
=> L = 2C + 4(H - C) [substitute H-C for P]
=> L = 2C + 4H - 4C [expand 4(H-C) to 4H-4C]
=> L = 4H - 2C [combine 2C-4C into -2C]
=> 0 = 4H - 2C - L [subtract L from both sides]
=> 2C = 4H - L [add 2C to both sides]
=> C = 2H - L/2 [divide both sides by 2] (4)
现在你有两个公式,一个可以从头和腿计算小鸡的数量(4)
,另一个可以从小鸡和头计算猪的数量(3)
。
所以这是执行此操作的 Python 代码,通过适当的检查以确保您不允许一些更奇怪的数学解决方案,例如 2 个头和 7 条腿给我们一头半猪和半只小鸡,或者 1 个头和12 条腿给 5 头猪和 -4 只小鸡 :-)
def solve (numLegs, numHeads):
# Use the formulae (these make integers).
chicks = numHeads * 2 - int (numLegs / 2)
pigs = numHeads - chicks
# Don't allow negative number of animals.
if chicks < 0 or pigs < 0:
return [None, None]
# Don't allow fractional animals.
if chicks * 2 + pigs * 4 != numLegs:
return [None, None]
if chicks + pigs != numHeads:
return [None, None]
return [pigs, chicks]
当然,如果您传入小数的头或腿,则所有赌注都将被取消。这是一个完整的测试程序,因此您可以尝试各种值以确保两种方法返回相同的值:
import sys
def usage (reason):
print "Error: %s"%(reason)
print "Usage: solve <numHeads> <numLegs>"
sys.exit (1);
def solve1 (numLegs, numHeads):
for numChicks in range (0, numHeads + 1):
numPigs = numHeads - numChicks
totLegs = 4 * numPigs + 2 * numChicks
if totLegs == numLegs:
return [numPigs, numChicks]
return [None, None]
def solve2 (numLegs, numHeads):
chicks = numHeads * 2 - int (numLegs / 2)
pigs = numHeads - chicks
if chicks < 0 or pigs < 0: return [None, None]
if chicks * 2 + pigs * 4 != numLegs: return [None, None]
if chicks + pigs != numHeads: return [None, None]
return [pigs, chicks]
if len (sys.argv) != 3:
usage ("Wrong number of parameters (%d)"%(len (sys.argv)))
try: heads = int (sys.argv[1])
except: usage ("Invalid <numHeads> of '%s'"%(sys.argv[1]))
try: legs = int (sys.argv[2])
except: usage ("Invalid <numLegs> of '%s'"%(sys.argv[2]))
print "[pigs, chicks]:"
print " ", solve1 (legs, heads)
print " ", solve2 (legs, heads)