Я бачу, що багато людей відповіли на питання про переповнення, але я хотів вирішити його первісну проблему. Він сказав, що проблема полягає в тому, щоб знайти б = c таким, щоб усі цифри використовувались без повторення. Гаразд, це не те, що він запитував у цій публікації, але я все одно вважаю, що потрібно було вивчити верхню межу проблеми і зробити висновок, що йому ніколи не потрібно буде обчислювати чи виявляти переповнення (зауважте: я не досвідчений з математики, тому я робив цей крок за кроком, але кінцевий результат був настільки простим, що це може мати просту формулу).
Основний момент полягає в тому, що верхня межа, необхідна для задачі або для a, b, або c, становить 98,765,432. У будь-якому випадку, починаючи з розбиття задачі на тривіальну та нетривіальну частини:
- x 0 == 1 (усі перестановки 9, 8, 7, 6, 5, 4, 3, 2 - розчини)
- x 1 == x (рішення не можливе)
- 0 b == 0 (рішення не можливе)
- 1 b == 1 (рішення не можливе)
- a b , a> 1, b> 1 (нетривіально)
Тепер нам просто потрібно показати, що ніяке інше рішення неможливе і лише перестановки є дійсними (і тоді код для їх друку є тривіальним). Повертаємося до верхньої межі. Насправді верхня межа становить c ≤ 98,765,432. Це верхня межа, тому що це найбільше число з 8 цифр (10 цифр загалом мінус 1 для кожного a і b). Ця верхня межа є лише для c, оскільки межі для a і b повинні бути набагато нижчими через експоненціального зростання, як ми можемо розрахувати, змінюючись b від 2 до верхньої межі:
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
Зауважте, наприклад, останній рядок: там сказано, що 1,97 ^ 27 ~ 98М. Наприклад, 1 ^ 27 == 1 і 2 ^ 27 == 134,217,728, і це не є рішенням, оскільки він має 9 цифр (2> 1,97, тож він фактично більший, ніж те, що слід перевірити). Як видно, комбінацій, доступних для тестування a і b, дійсно мало. Для b == 14 нам потрібно спробувати 2 і 3. Для b == 3 ми почнемо з 2 і зупинимось на 462. Усі результати вважаються меншими, ніж ~ 98М.
Тепер просто протестуйте всі комбінації, наведені вище, і шукайте ті, які не повторюють жодної цифри:
['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)
Жодна з них не відповідає проблемі (що також можна побачити за відсутності "0", "1", ..., "9").
Приклад коду, який вирішує його, випливає далі. Також зауважте, що написано в Python, не тому, що для нього потрібні довільні точні цілі числа (код не обчислює нічого більшого, ніж 98 мільйонів), а тому, що ми з’ясували, що кількість тестів настільки мала, що нам слід використовувати мову високого рівня, щоб використовувати його вбудовані контейнери та бібліотеки (також зверніть увагу: код має 28 рядків).
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)