Python 2.7 - 380 378 372 371 367 363 357 354 352 348 336 ký tự
Chỉ cần một cuộc tìm kiếm vũ phu đơn giản.
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]
Chạy ví dụ:
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)
Giải trình:
s(x)
là một hàm lấy một chuỗi chứa một chuỗi các chữ số và trả về tất cả các biểu thức sử dụng các chữ số đó theo thứ tự đó.
[x]['1'>x>'0':]
ước tính cho một danh sách chứa x nếu x là '0' hoặc một chuỗi các chữ số không bắt đầu bằng '0'; mặt khác, nó đánh giá một danh sách trống. Về cơ bản, điều này xử lý trường hợp tôi nối tất cả các chữ số lại với nhau.
['(%s%s%s)'%f for i in range(1,len(x))for f in product(s(x[:i]),'*/-+^',s(x[i:]))]
về cơ bản phân vùng x thành hai phần (cả hai đều có độ dài khác không), gọi s () trên mỗi phần và nối tất cả các kết quả cùng với một số toán tử giữa chúng, bằng cách sử dụng sản phẩm ().
E(e)
về cơ bản là một eval an toàn. Nó trả về giá trị của e nếu e hợp lệ và Không có gì khác.
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}
Về cơ bản, mã này thử tất cả các số trong phạm vi, hoán vị các chữ số của chúng và kiểm tra từng biểu thức s () tạo ra hoán vị đó, bỏ qua biểu thức đầu tiên nếu x không bắt đầu bằng '0', vì nếu x không bắt đầu bằng ' 0 'thì biểu thức đầu tiên sẽ chỉ là x.
Phiên bản thay thế - 397 ký tự
Đây là mã của tôi nếu bạn được yêu cầu sử dụng phân số:
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","")
/
việc? Ví dụ là1/3
gì?