Widzę, że wiele osób odpowiedziało na pytanie o przepełnienie, ale chciałem rozwiązać jego pierwotny problem. Powiedział, że problemem jest znalezienie b = c, tak aby wszystkie cyfry były używane bez powtarzania. Ok, nie o to pytał w tym poście, ale nadal uważam, że konieczne było przestudiowanie górnej granicy problemu i wyciągnięcie wniosku, że nigdy nie będzie musiał obliczać ani wykrywać przepełnienia (uwaga: nie jestem biegły z matematyki, więc zrobiłem to krok po kroku, ale wynik końcowy był tak prosty, że może mieć prostą formułę).
Głównym punktem jest to, że górna granica, której wymaga problem dla a, b lub c, wynosi 98.765.432. W każdym razie, zaczynając od podzielenia problemu na trywialne i nietrywialne części:
- x 0 == 1 (wszystkie permutacje 9, 8, 7, 6, 5, 4, 3, 2 są rozwiązaniami)
- x 1 == x (niemożliwe rozwiązanie)
- 0 b == 0 (niemożliwe rozwiązanie)
- 1 b == 1 (niemożliwe rozwiązanie)
- a b , a> 1, b> 1 (nietrywialne)
Teraz musimy tylko pokazać, że żadne inne rozwiązanie nie jest możliwe, a poprawne są tylko permutacje (a następnie kod do ich wydrukowania jest trywialny). Wracamy do górnej granicy. W rzeczywistości górna granica wynosi c ≤ 98,765,432. Jest to górna granica, ponieważ jest to największa liczba z 8 cyframi (łącznie 10 cyfr minus 1 dla każdego a i b). Ta górna granica jest tylko dla c, ponieważ granice aib muszą być znacznie niższe z powodu wykładniczego wzrostu, jak możemy obliczyć, zmieniając b od 2 do górnej granicy:
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
Zauważ, na przykład ostatnia linia: mówi, że 1,97 ^ 27 ~ 98M. Na przykład 1 ^ 27 == 1 i 2 ^ 27 == 134.217.728 i to nie jest rozwiązanie, ponieważ ma 9 cyfr (2> 1,97, więc jest faktycznie większe niż to, co powinno być przetestowane). Jak widać, kombinacje dostępne do testowania aib są naprawdę małe. Dla b == 14 musimy spróbować 2 i 3. Dla b == 3 zaczynamy od 2 i zatrzymujemy się na 462. Wszystkie wyniki są mniejsze niż ~ 98 mln.
Teraz wystarczy przetestować wszystkie powyższe kombinacje i poszukać tych, które nie powtarzają żadnych cyfr:
['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)
Żadne z nich nie pasuje do problemu (co można również zobaczyć przez brak „0”, „1”, ..., „9”).
Przykładowy kod, który go rozwiązuje, jest następujący. Zauważ też, że jest napisane w Pythonie, nie dlatego, że wymaga liczb całkowitych o dowolnej precyzji (kod nie oblicza niczego większego niż 98 milionów), ale ponieważ odkryliśmy, że liczba testów jest tak mała, że powinniśmy używać języka wysokiego poziomu, aby korzystaj z wbudowanych kontenerów i bibliotek (uwaga: kod ma 28 wierszy).
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)