排列不起作用

时间:2014-05-13 18:29:31

标签: python permutation

我有一个简单的问题,我想解决。这是:

([] [] [] / [] [] [])+([] [] / [] [])= 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循环的东西是错的,我似乎无法找到错误

为什么它不起作用,如何解决?

5 个答案:

答案 0 :(得分:2)

  • 如果使用Python2,请添加

    from __future__ import division
    

    使用浮点除法。否则1/2等于0。这也是 影响mn的计算,因为所有输入都是整数 但您希望mn成为花车。

  • 如果使用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)

我发现了几件事。

  1. target仍然是一个字符串 - 需要转换
  2. mn1/2可能正在使用整数除法(取决于您的python版本),即它们截断为floor(val1 / val2)
  3. 我不确定,但我很确定你需要在print语句中索引{}。如果确实如此,我从未见过它。
  4. 在整数和浮点数的情况下,
  5. bool(val)始终为True,除了0。您需要更改此
  6. 以防万一 - 对浮点错误保持警惕 - valuetarget可能完全不相同。你可能需要回合才能确定。检查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))