Python 2.7 - 380 378 372 371 367 363 357 354 352 348 336 karakter
Hanya pencarian brute force sederhana.
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]
Contoh dijalankan:
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)
Penjelasan:
s(x)
adalah fungsi yang mengambil string yang berisi urutan digit dan mengembalikan semua ekspresi menggunakan digit tersebut dalam urutan itu.
[x]['1'>x>'0':]
mengevaluasi ke daftar yang berisi x jika x adalah '0' atau urutan digit yang tidak dimulai dengan '0'; jika tidak, ia mengevaluasi ke daftar kosong. Pada dasarnya ini menangani kasus di mana saya menggabungkan semua angka.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
pada dasarnya partisi x menjadi dua bagian (keduanya panjangnya tidak nol), memanggil s () pada setiap bagian dan menggabungkan semua hasil bersama beberapa operator di antara mereka, dengan menggunakan produk ().
E(e)
pada dasarnya adalah eval yang aman. Ini mengembalikan nilai e jika e valid dan Tidak ada sebaliknya.
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}
Pada dasarnya, kode ini mencoba semua angka dalam rentang, membolehkan digitnya dan menguji setiap ekspresi yang dihasilkan () untuk permutasi itu, mengabaikan ekspresi pertama jika x tidak dimulai dengan '0', karena jika x tidak memulai dengan ' 0 'maka ekspresi pertama hanya akan menjadi x.
Versi alternatif - 397 karakter
Ini kode saya jika Anda diharuskan menggunakan pecahan:
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","")
/kerjanya? Misalnya apa1/3?