Saya melihat bahwa banyak orang menjawab pertanyaan tentang meluap, tetapi saya ingin mengatasi masalah aslinya. Dia mengatakan masalahnya adalah menemukan b = c sehingga semua digit digunakan tanpa mengulangi. Oke, bukan itu yang dia tanyakan dalam posting ini, tapi saya masih berpikir bahwa itu perlu untuk mempelajari batas atas masalah dan menyimpulkan bahwa dia tidak perlu menghitung atau mendeteksi luapan (catatan: Saya tidak cakap dalam matematika jadi saya melakukan langkah demi langkah ini, tetapi hasil akhirnya sangat sederhana sehingga ini mungkin memiliki rumus sederhana).
Poin utama adalah bahwa batas atas yang dibutuhkan oleh masalah untuk a, b atau c adalah 98.765.432. Pokoknya, mulailah dengan memecah masalah di bagian sepele dan non sepele:
- x 0 == 1 (semua permutasi 9, 8, 7, 6, 5, 4, 3, 2 adalah solusi)
- x 1 == x (tidak ada solusi yang mungkin)
- 0 b == 0 (tidak ada solusi yang mungkin)
- 1 b == 1 (tidak ada solusi yang mungkin)
- a b , a> 1, b> 1 (tidak sepele)
Sekarang kita hanya perlu menunjukkan bahwa tidak ada solusi lain yang mungkin dan hanya permutasi yang valid (dan kemudian kode untuk mencetaknya adalah sepele). Kami kembali ke batas atas. Sebenarnya batas atas adalah c ≤ 98.765.432. Ini adalah batas atas karena ini adalah angka terbesar dengan 8 digit (total 10 digit minus 1 untuk masing-masing a dan b). Batas atas ini hanya untuk c karena batas untuk a dan b harus jauh lebih rendah karena pertumbuhan eksponensial, seperti yang dapat kita hitung, bervariasi b dari 2 hingga batas atas:
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
Perhatikan, misalnya baris terakhir: dikatakan bahwa 1,97 ^ 27 ~ 98M. Jadi, misalnya, 1 ^ 27 == 1 dan 2 ^ 27 == 134.217.728 dan itu bukan solusi karena memiliki 9 digit (2> 1,97 sehingga sebenarnya lebih besar dari apa yang harus diuji). Seperti dapat dilihat, kombinasi yang tersedia untuk pengujian a dan b sangat kecil. Untuk b == 14, kita perlu mencoba 2 dan 3. Untuk b == 3, kita mulai dari 2 dan berhenti di 462. Semua hasil yang diberikan kurang dari ~ 98M.
Sekarang coba saja semua kombinasi di atas dan cari yang tidak mengulangi angka apa pun:
['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)
Tak satu pun dari mereka cocok dengan masalah (yang juga bisa dilihat dengan tidak adanya '0', '1', ..., '9').
Contoh kode yang menyelesaikannya mengikuti. Perhatikan juga bahwa ini ditulis dengan Python, bukan karena membutuhkan bilangan bulat presisi yang sewenang-wenang (kode tidak menghitung apa pun yang lebih besar dari 98 juta), tetapi karena kami menemukan bahwa jumlah tes sangat kecil sehingga kami harus menggunakan bahasa tingkat tinggi untuk memanfaatkan wadah dan pustaka bawaannya (juga perhatikan: kode memiliki 28 baris).
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)