Пітон 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, якщо x дорівнює "0" або послідовності цифр, що не починається з "0"; в іншому випадку він оцінюється в порожній список. В основному це стосується випадку, коли я з'єдную всі цифри разом.
['(%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)
в основному є безпечним eval. Він повертає значення 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?