蟒2.7 - 380 378 372 371 367 363 357 354 352 348 336个字符
只是一个简单的蛮力搜索。
from itertools import*
s=lambda x:[x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
try:return eval(e.replace("^","**"))
except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v]
示例运行:
1
300
9
128 (2^(8-1))
289 ((9+8)^2)
216 (6^(1+2))
121 (11^2)
153 (3*51)
25 (5^2)
125 (5^(2+1))
126 (6*21)
127 ((2^7)-1)
说明:
s(x)
是一个函数,它接收包含数字序列的字符串,并按该顺序返回使用这些数字的所有表达式。
[x]['1'>x>'0':]
如果x为'0'或不以'0'开头的数字序列,则求值为包含x的列表;否则,它将评估为空列表。基本上,这可以处理我将所有数字连在一起的情况。
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
基本上将x分为两部分(均为非零长度),在每个部分上调用s(),并使用product()将所有结果与它们之间的某些运算符连接在一起。
E(e)
基本上是安全的评估。如果e有效,则返回e的值,否则返回None。
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
基本上,这段代码会尝试该范围内的所有数字,排列其数字并测试s()为该排列生成的每个表达式,如果x的开头不是'0',则忽略第一个表达式,因为如果x的开头不是' 0',那么第一个表达式就是x。
替代版本-397个字符
如果需要使用分数,这是我的代码:
from fractions import*
from itertools import*
s=lambda x:["Fraction(%s)"%x]['1'>x>'0':]+['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
def E(e):
try:return eval(e.replace("^","**"))
except:0
A={i:e for i in range(input(),input()+1)for x in permutations(`i`)for e in s("".join(x))[x>='1':]if E(e)==i}
print len(A)
for v in A:print v,A[v].replace("Fraction","")
/
工作原理吗?例如什么1/3
?