我有一个简单的问题,我想解决。这是:
([] [] [] / [] [] [])+([] [] / [] [])= 1
目的是使用数字0-9使上述陈述成立,并且每个数字只能使用一次。此外,每个部分的总和等于一半。例如(1/2)+(1/2)= 1
我已经启动它但它似乎不起作用 。 这是我已经开始的代码
from itertools import permutations
target = 1
for a,b,c,d,e,f,g,h,i,j in permutations(range(0,10), 10):
m = ((100*a + 10*b + c)/(100*d + 10*e + f)) #works out first half of sum
n = ((10*g + h)/(10*i + j)) #works out second half of sum
value = m + n #works out the answer
if value == target and (bool(m) == bool(1/2)) and (bool(n) == bool(1/2)): # checks if answer = the target and makes sure both parts of the sum are equal to a half
print("{}{}{}/{}{}{} + {}{}/{}{} = {}".format(a,b,c,d,e,f,g,h,i,j,target)) #prints out the answer
运行时的结果是空白提示只是等待,然后什么都没有出现,提示关闭。
通过python IDLE运行时,我也得到相同的响应。它等待,控制台没有检测到任何错误。
表示我的函数没有问题,但是for循环的东西是错的,我似乎无法找到错误
为什么它不起作用,如何解决?
答案 0 :(得分:2)
如果使用Python2,请添加
from __future__ import division
使用浮点除法。否则1/2
等于0
。这也是
影响m
和n
的计算,因为所有输入都是整数
但您希望m
和n
成为花车。
如果使用Python3,
target = input("what number do you want to reach? ")
是一个错误,因为input
会返回str
。您需要target
才能成为
浮动(或者,如DSM指出的那样,分数):
target = float(input("what number do you want to reach? "))
bool(m)==bool(1/2)
是一个错误。没有浮点除法,bool(1/2)
等于bool(0)
False
。使用浮动除法,bool(1/2)
为True
,但是
然后bool(m)==bool(1/2)
会测试bool(m) == True
。
对于除{0}之外的True
的任何浮点值,这将是m
。
相反,要检查m
是否等于target/2
,请使用
abs(m - target/2) < eps
对于eps
的一些可容忍的小值。
不要使用m == target/2
,因为检查浮点数是否相等可能会失败
由于真实的浮点表示的不精确性
号。
from __future__ import division
from itertools import permutations
eps = 1e-8
target = float(input("what number do you want to reach? "))
for a,b,c,d,e,f,g,h,i,j in permutations(range(0,10), 10):
m = ((100*a + 10*b + c)/(100*d + 10*e + f)) #works out first half of sum
n = ((10*g + h)/(10*i + j)) #works out second half of sum
value = m + n #works out the answer
if value == target and abs(m - target/2) < eps and abs(n - target/2) < eps: # checks if answer = the target and makes sure both parts of the sum are equal to a half
print("{}{}{}/{}{}{} + {}{}/{}{} = {}".format(a,b,c,d,e,f,g,h,i,j,target)) #prints out the answer
产量
what number do you want to reach? 1
067/134 + 29/58 = 1.0
069/138 + 27/54 = 1.0
073/146 + 29/58 = 1.0
079/158 + 23/46 = 1.0
079/158 + 32/64 = 1.0
093/186 + 27/54 = 1.0
135/270 + 48/96 = 1.0
138/276 + 45/90 = 1.0
145/290 + 38/76 = 1.0
148/296 + 35/70 = 1.0
185/370 + 46/92 = 1.0
186/372 + 45/90 = 1.0
267/534 + 09/18 = 1.0
269/538 + 07/14 = 1.0
273/546 + 09/18 = 1.0
293/586 + 07/14 = 1.0
307/614 + 29/58 = 1.0
309/618 + 27/54 = 1.0
327/654 + 09/18 = 1.0
329/658 + 07/14 = 1.0
351/702 + 48/96 = 1.0
381/762 + 45/90 = 1.0
451/902 + 38/76 = 1.0
481/962 + 35/70 = 1.0
485/970 + 13/26 = 1.0
485/970 + 16/32 = 1.0
485/970 + 31/62 = 1.0
486/972 + 15/30 = 1.0
答案 1 :(得分:0)
我发现了几件事。
target
仍然是一个字符串 - 需要转换m
,n
和1/2
可能正在使用整数除法(取决于您的python版本),即它们截断为floor(val1 / val2){}
。如果确实如此,我从未见过它。bool(val)
始终为True,除了0。您需要更改此value
和target
可能完全不相同。你可能需要回合才能确定。检查m和n == 0.5也是如此。答案 2 :(得分:0)
其他人已经指出了这些错误,所以我只会补充一点,因为Python已经有一个Fraction
类,你可以使用它:
from fractions import Fraction
from itertools import permutations
# python 3
target = Fraction(input("what number do you want to reach? "))
# (in Python 2, use raw_input)
for a,b,c,d,e,f,g,h,i,j in permutations(map(Fraction, range(0,10)), 10):
m = (100*a + 10*b + c)/(100*d + 10*e + f)
n = (10*g + h)/(10*i + j)
value = m + n
if value == target:
print("{}{}{}/{}{}{} + {}{}/{}{} = {}".format(a,b,c,d,e,f,g,h,i,j,target)) #prints out the answer
给出了
dsm@winter:~/coding$ python3 permtarg.py
what number do you want to reach? 1
024/138 + 57/69 = 1
027/189 + 54/63 = 1
028/146 + 59/73 = 1
032/184 + 57/69 = 1
...
更新:哎呀,我没有抓住“每个部分也必须是1/2”的条件。但这可以通过添加and m == n == Fraction(1, 2)
来轻松处理。
答案 3 :(得分:0)
枚举数字0-9的所有排列是10! == 360万次迭代。但是,由于每个术语必须等于一半的限制,并且每个数字只能使用一次,我们可以巧妙地减少工作量。
因此,对于a / b + c / d = 1,其中b有3位数,b必须是偶数,并且具有唯一数字,因此必须是以下之一:
b_candidates = [i for i in range(2,1000,2)
if len(set('{:03}'.format(i))) == 3]
len(b_candidates)= 360
如果我们进一步限制它a = b // 2并且a和b的所有数字必须是唯一的
b_candidates = [i for i in range(2,1000,2)
if len(set('{:03}{:03}'.format(i,i//2))) == 6]
len(b_candidates)== 75
对d执行类似的操作
d_candidates = [i for i in range(2,100,2)
if len(set('{:02}{:02}'.format(i,i//2))) == 4]
len(d_candidates)== 27
现在,我们只有75 * 27 == 2025项要比较。
answers = ['{:03}/{:03} + {:02}/{:02}'.format(b//2,b,d//2,d)
for b in b_candidates for d in d_candidates
if len(set('{:03}{:03}{:02}{:02}'.format(b//2,b,d//2,d))) == 10]
['067/134 + 29/58',
'069/138 + 27/54',
'073/146 + 29/58',
'079/158 + 23/46',
'079/158 + 32/64',
'093/186 + 27/54',
'135/270 + 48/96',
'138/276 + 45/90',
'145/290 + 38/76',
'148/296 + 35/70',
'185/370 + 46/92',
'186/372 + 45/90',
'267/534 + 09/18',
'269/538 + 07/14',
'273/546 + 09/18',
'293/586 + 07/14',
'307/614 + 29/58',
'309/618 + 27/54',
'327/654 + 09/18',
'329/658 + 07/14',
'351/702 + 48/96',
'381/762 + 45/90',
'451/902 + 38/76',
'481/962 + 35/70',
'485/970 + 13/26',
'485/970 + 16/32',
'485/970 + 31/62',
'486/972 + 15/30']
答案 4 :(得分:0)
我实际上正在尝试并意识到我真正需要的是从bool()更改为float()
from itertools import permutations
target = 1
x = 0
for a,b,c,d,e,f,g,h,i,j in permutations(range(0,10), 10):
m = float((100*a + 10*b + c)/(100*d + 10*e + f)) #works out first half of sum
n = float((10*g + h)/(10*i + j)) #works out second half of sum
value = float(m + n) #works out the answer
if value == target and float((100*d + 10*e + f)/2) == float(100*a + 10*b + c) and float((10*i + j)/2) == float(10*g + h) :
x = x + 1
print("{}{}{}/{}{}{} + {}{}/{}{} = {}".format(a,b,c,d,e,f,g,h,i,j,target)) #prints out the answer
print("there were {} answers".format(x))