Python 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 'тогда первое выражение будет просто х.
Альтернативная версия - 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
?