Tôi thấy rằng rất nhiều người đã trả lời câu hỏi về tràn, nhưng tôi muốn giải quyết vấn đề ban đầu của anh ấy. Ông nói rằng vấn đề là tìm một b = c sao cho tất cả các chữ số được sử dụng mà không lặp lại. Ok, đó không phải là những gì anh ấy đã hỏi trong bài viết này, nhưng tôi vẫn nghĩ rằng cần phải nghiên cứu giới hạn trên của vấn đề và kết luận rằng anh ấy sẽ không bao giờ cần phải tính toán hoặc phát hiện một lỗi tràn (lưu ý: Tôi không thành thạo trong toán học nên tôi đã làm điều này từng bước một, nhưng kết quả cuối cùng đơn giản đến mức điều này có thể có một công thức đơn giản).
Điểm chính là giới hạn trên mà vấn đề yêu cầu đối với a, b hoặc c là 98.765.432. Dù sao, bắt đầu bằng cách phân chia vấn đề trong các phần tầm thường và không tầm thường:
- x 0 == 1 (tất cả các hoán vị của 9, 8, 7, 6, 5, 4, 3, 2 là các giải pháp)
- x 1 == x (không có giải pháp nào khả thi)
- 0 b == 0 (không có giải pháp nào khả thi)
- 1 b == 1 (không có giải pháp nào khả thi)
- a b , a> 1, b> 1 (không tầm thường)
Bây giờ chúng ta chỉ cần chỉ ra rằng không có giải pháp nào khả thi và chỉ có hoán vị là hợp lệ (và sau đó mã để in chúng là tầm thường). Chúng tôi quay trở lại giới hạn trên. Trên thực tế giới hạn trên là c ≤ 98.765.432. Đó là giới hạn trên bởi vì đó là số lớn nhất có 8 chữ số (tổng cộng 10 chữ số trừ 1 cho mỗi a và b). Giới hạn trên này chỉ dành cho c vì giới hạn của a và b phải thấp hơn nhiều vì sự tăng trưởng theo cấp số nhân, như chúng ta có thể tính toán, thay đổi b từ 2 đến giới hạn trên:
9938.08^2 == 98765432
462.241^3 == 98765432
99.6899^4 == 98765432
39.7119^5 == 98765432
21.4998^6 == 98765432
13.8703^7 == 98765432
9.98448^8 == 98765432
7.73196^9 == 98765432
6.30174^10 == 98765432
5.33068^11 == 98765432
4.63679^12 == 98765432
4.12069^13 == 98765432
3.72429^14 == 98765432
3.41172^15 == 98765432
3.15982^16 == 98765432
2.95305^17 == 98765432
2.78064^18 == 98765432
2.63493^19 == 98765432
2.51033^20 == 98765432
2.40268^21 == 98765432
2.30883^22 == 98765432
2.22634^23 == 98765432
2.15332^24 == 98765432
2.08826^25 == 98765432
2.02995^26 == 98765432
1.97741^27 == 98765432
Lưu ý, ví dụ dòng cuối cùng: nó nói rằng 1,97 ^ 27 ~ 98M. Vì vậy, ví dụ: 1 ^ 27 == 1 và 2 ^ 27 == 134.217.728 và đó không phải là giải pháp vì nó có 9 chữ số (2> 1.97 nên thực sự lớn hơn những gì cần kiểm tra). Như có thể thấy, các kết hợp có sẵn để thử nghiệm a và b thực sự rất nhỏ. Đối với b == 14, chúng ta cần thử 2 và 3. Với b == 3, chúng ta bắt đầu từ 2 và dừng ở 462. Tất cả các kết quả được cấp dưới ~ 98M.
Bây giờ chỉ cần kiểm tra tất cả các kết hợp ở trên và tìm kiếm những kết hợp không lặp lại bất kỳ chữ số nào:
['0', '2', '4', '5', '6', '7', '8'] 84^2 = 7056
['1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481
['0', '1', '2', '3', '4', '5', '8', '9'] 59^2 = 3481 (+leading zero)
['1', '2', '3', '5', '8'] 8^3 = 512
['0', '1', '2', '3', '5', '8'] 8^3 = 512 (+leading zero)
['1', '2', '4', '6'] 4^2 = 16
['0', '1', '2', '4', '6'] 4^2 = 16 (+leading zero)
['1', '2', '4', '6'] 2^4 = 16
['0', '1', '2', '4', '6'] 2^4 = 16 (+leading zero)
['1', '2', '8', '9'] 9^2 = 81
['0', '1', '2', '8', '9'] 9^2 = 81 (+leading zero)
['1', '3', '4', '8'] 3^4 = 81
['0', '1', '3', '4', '8'] 3^4 = 81 (+leading zero)
['2', '3', '6', '7', '9'] 3^6 = 729
['0', '2', '3', '6', '7', '9'] 3^6 = 729 (+leading zero)
['2', '3', '8'] 2^3 = 8
['0', '2', '3', '8'] 2^3 = 8 (+leading zero)
['2', '3', '9'] 3^2 = 9
['0', '2', '3', '9'] 3^2 = 9 (+leading zero)
['2', '4', '6', '8'] 8^2 = 64
['0', '2', '4', '6', '8'] 8^2 = 64 (+leading zero)
['2', '4', '7', '9'] 7^2 = 49
['0', '2', '4', '7', '9'] 7^2 = 49 (+leading zero)
Không ai trong số họ phù hợp với vấn đề (điều này cũng có thể được nhìn thấy khi không có '0', '1', ..., '9').
Mã ví dụ giải quyết nó sau. Cũng lưu ý rằng được viết bằng Python, không phải vì nó cần các số nguyên chính xác tùy ý (mã không tính toán bất cứ thứ gì lớn hơn 98 triệu), nhưng vì chúng tôi phát hiện ra rằng số lượng thử nghiệm quá nhỏ nên chúng tôi nên sử dụng ngôn ngữ cấp cao để sử dụng các thùng chứa và thư viện tích hợp của nó (cũng lưu ý: mã có 28 dòng).
import math
m = 98765432
l = []
for i in xrange(2, 98765432):
inv = 1.0/i
r = m**inv
if (r < 2.0): break
top = int(math.floor(r))
assert(top <= m)
for j in xrange(2, top+1):
s = str(i) + str(j) + str(j**i)
l.append((sorted(s), i, j, j**i))
assert(j**i <= m)
l.sort()
for s, i, j, ji in l:
assert(ji <= m)
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d' % (s, i, j, ji)
# Try with non significant zero somewhere
s = ['0'] + s
ss = sorted(set(s))
if s == ss:
print '%s %d^%d = %d (+leading zero)' % (s, i, j, ji)